#Set working directory to appropriate folder for inputs and outputs on Google Drive

Initialize

Assign directory and load files

Look at markers of induced resistant lineages (versus all? versus sensitive? difference is lineages that were resistant to both independently)

expression of end resistant state markers in the induced resistant lineages

do cells from these lineages cluster together?

are cells from these lineages resistant to many or few conditions?

how else do these lineages distinguish themselves?

do we want to do a pathway analysis here?

Build new object that defines induced resistance from gDNA_collapsed

cross check against gDNA_cDNA_collapsed to look at things with cDNA representation


load('2022_01_14_analysis_scripts/2022_05_27_analysis/Assign_dominant_barcodes/all_data_final_lineages.RData') #seurat object with final lineage assignments

load('2022_01_14_analysis_scripts/2022_05_27_analysis/Preprocess_gDNA/preprocessed_gDNA.RData') # need list of all gDNA reads per lineage

load('2022_01_14_analysis_scripts/2022_05_27_analysis/Filtering_cDNA/filtered_cDNA.RData') # need list of all lineages with cDNA representation
load('2022_01_14_analysis_scripts/2022_05_27_analysis/Filtering_cDNA/resistant_lineage_lists.RData') # list of lineages passing filtering
load('2022_01_14_analysis_scripts/2022_05_27_analysis/Assign_dominant_barcodes/all_data_final_lineages.RData') # Load in the single cell object

#How many reads for each of these lineages? How many cells? Plot distribution of lineage size (cells? reads? which time?), correlation between time 1 and 2


nofilter_gDNA_lins <- list()
for (i in names(gDNA_collapsed)){
  if (i != 'FirstSample'){
  nofilter_gDNA_lins[[i]] <- gDNA_collapsed[[i]]$Lineage[gDNA_collapsed[[i]]$Reads > 1]
  }
}


dabtram_cocl2 <- list(dabtram = unique(c(nofilter_gDNA_lins$DabTram, nofilter_gDNA_lins$DabTramtoCis, nofilter_gDNA_lins$DabTramtoCoCl2, nofilter_gDNA_lins$DabTramtoDabTram)), 
                           cocl2 = unique(c(nofilter_gDNA_lins$CoCl2, nofilter_gDNA_lins$CoCl2toCis, nofilter_gDNA_lins$CoCl2toCoCl2, nofilter_gDNA_lins$CoCl2toDabTram)),
                           dabtramtococl2 = nofilter_gDNA_lins$DabTramtoCoCl2,
                           cocl2todabtram = nofilter_gDNA_lins$CoCl2toDabTram)

dabtram_cis <- list(dabtram = unique(c(nofilter_gDNA_lins$DabTram, nofilter_gDNA_lins$DabTramtoCis, nofilter_gDNA_lins$DabTramtoCoCl2, nofilter_gDNA_lins$DabTramtoDabTram)), 
                         cis = unique(c(nofilter_gDNA_lins$Cis, nofilter_gDNA_lins$CistoCis, nofilter_gDNA_lins$CistoCoCl2, nofilter_gDNA_lins$CistoDabTram)),
                         dabtramtocis = nofilter_gDNA_lins$DabTramtoCis,
                         cistodabtram = nofilter_gDNA_lins$CistoDabTram)

cocl2_cis <- list(cocl2 = unique(c(nofilter_gDNA_lins$CoCl2, nofilter_gDNA_lins$CoCl2toCis, nofilter_gDNA_lins$CoCl2toCoCl2, nofilter_gDNA_lins$CoCl2toDabTram)),
                       cis = (c(nofilter_gDNA_lins$Cis, nofilter_gDNA_lins$CistoCis, nofilter_gDNA_lins$CistoCoCl2, nofilter_gDNA_lins$CistoDabTram)),
                       cocl2tocis = nofilter_gDNA_lins$CoCl2toCis,
                       cistococl2 = nofilter_gDNA_lins$CistoCoCl2)

induced_resistant_lins <- list()

dabtram_cocl2_venn <- venn(dabtram_cocl2)

dabtram_cis_venn <- venn(dabtram_cis)

cocl2_cis_venn <- venn(cocl2_cis)


induced_resistant_lins[['DabTram_Inducedto_CoCl2']] = attr(dabtram_cocl2_venn, "intersections")$'dabtram:dabtramtococl2'
induced_resistant_lins[['CoCl2_Inducedto_DabTram']] = attr(dabtram_cocl2_venn, "intersections")$'cocl2:cocl2todabtram'

induced_resistant_lins[['DabTram_Inducedto_Cis']] = attr(dabtram_cis_venn, "intersections")$'dabtram:dabtramtocis'
induced_resistant_lins[['Cis_Inducedto_DabTram']] = attr(dabtram_cis_venn, "intersections")$'cis:cistodabtram'

induced_resistant_lins[['CoCl2_Inducedto_Cis']] = attr(cocl2_cis_venn, "intersections")$'cocl2:cocl2tocis'
induced_resistant_lins[['Cis_Inducedto_CoCl2']] = attr(cocl2_cis_venn, "intersections")$'cis:cistococl2'

#plotting cell # correlation between time 1 and 2

induced_resistant_df <- list()

for (i in names(induced_resistant_lins)){
  split <- strsplit(i, '_')
  time1 <- split[[1]][1]
  time2 <- paste0(split[[1]][1], 'to', split[[1]][3])
  
  test <- filter(gDNA_collapsed[[time1]], gDNA_collapsed[[time1]]$Lineage %in% induced_resistant_lins[[i]])
  colnames(test)[colnames(test) == "Reads"] <- "Reads_time1"
  colnames(test)[colnames(test) == "RPM"] <- "RPM_time1"

  test$Num_Cells_time1 <- rep(0, length(test$Lineage))
  test$Num_Cells_time2 <- rep(0, length(test$Lineage))
  test$Reads_time2 <- rep(0, length(test$Lineage))
  
  for (k in 1:length(test$Lineage)){
    lin <- test$Lineage[[k]]
  
    if (is.element(lin, gDNA_cDNA_collapsed[[time1]]$Lineage)){
      test$Num_Cells_time1[[k]] <- gDNA_cDNA_collapsed[[time1]]$Num_Cells[gDNA_cDNA_collapsed[[time1]]$Lineage == lin]
    }
    if (is.element(lin, gDNA_cDNA_collapsed[[time2]]$Lineage)){
      test$Num_Cells_time2[[k]] <- gDNA_cDNA_collapsed[[time2]]$Num_Cells[gDNA_cDNA_collapsed[[time2]]$Lineage == lin]
    }
    test$Reads_time2[[k]] <- gDNA_collapsed[[time2]]$Reads[gDNA_collapsed[[time2]]$Lineage == lin]
    
    test$Num_Cells_time1_norm[[k]] <- test$Num_Cells_time1[[k]] / length(all_data$OG_condition == time1)
    
  }
  induced_resistant_df[[i]] <- test  
}

Find gene expression markers of dabtram induced to cocl2

for (i in names(induced_resistant_df)){
  print(ggplot(induced_resistant_df[[i]], aes(x = Num_Cells_time2, y = Num_Cells_time1)) + geom_point() + ggtitle(paste("per lineage # cells at time 1 vs time 2 in", i)))
}


# for (i in names(cDNA_excluded)){
#   print(ggplot(data = cDNA_excluded[[i]], aes(x = Num_Cells)) + geom_bar() + labs(x = 'Number of Cells per lineage', title = paste(i, "cDNA lineages lost in filtering")))
#   print(ggplot(data = gDNA_cDNA_collapsed[[i]], aes(x = Num_Cells)) + geom_bar() + labs(x = 'Number of Cells per lineage ', title = paste(i, "cDNA lineages prior to filtering")))      
# }
# dev.off()

Find gene expression markers of cocl2 induced to dabtram

# Finding the lineages that end up induced resistant to cocl2, in the dabtram object
Dabtram_inducedto_CoCl2 <- names(all_data$Lineage[all_data$OG_condition == 'dabtram' & all_data$Lineage %in% induced_resistant_lins$DabTram_Inducedto_CoCl2])
# Finding the lineages did not 
Dabtram_not_inducedto_CoCl2 <- names(all_data$Lineage[all_data$OG_condition == 'dabtram' & all_data$Lineage %in% attr(dabtram_cocl2_venn, "intersections")$'dabtram'])

# Find induced markers
dabtram_inducedto_cocl2_markers <- FindMarkers(all_data, ident.1 = Dabtram_inducedto_CoCl2, ident.2 = Dabtram_not_inducedto_CoCl2, logfc.threshold = 0.25)

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~03s          
  |++                                                | 2 % ~03s          
  |++                                                | 3 % ~02s          
  |+++                                               | 4 % ~02s          
  |+++                                               | 5 % ~02s          
  |++++                                              | 6 % ~02s          
  |++++                                              | 7 % ~02s          
  |+++++                                             | 8 % ~02s          
  |+++++                                             | 9 % ~02s          
  |++++++                                            | 10% ~02s          
  |++++++                                            | 11% ~02s          
  |+++++++                                           | 12% ~02s          
  |+++++++                                           | 13% ~02s          
  |++++++++                                          | 14% ~02s          
  |++++++++                                          | 15% ~02s          
  |+++++++++                                         | 16% ~02s          
  |+++++++++                                         | 18% ~02s          
  |++++++++++                                        | 19% ~02s          
  |++++++++++                                        | 20% ~02s          
  |+++++++++++                                       | 21% ~02s          
  |+++++++++++                                       | 22% ~02s          
  |++++++++++++                                      | 23% ~02s          
  |++++++++++++                                      | 24% ~02s          
  |+++++++++++++                                     | 25% ~02s          
  |+++++++++++++                                     | 26% ~02s          
  |++++++++++++++                                    | 27% ~02s          
  |++++++++++++++                                    | 28% ~02s          
  |+++++++++++++++                                   | 29% ~02s          
  |+++++++++++++++                                   | 30% ~02s          
  |++++++++++++++++                                  | 31% ~02s          
  |++++++++++++++++                                  | 32% ~02s          
  |+++++++++++++++++                                 | 33% ~02s          
  |++++++++++++++++++                                | 34% ~02s          
  |++++++++++++++++++                                | 35% ~02s          
  |+++++++++++++++++++                               | 36% ~02s          
  |+++++++++++++++++++                               | 37% ~02s          
  |++++++++++++++++++++                              | 38% ~01s          
  |++++++++++++++++++++                              | 39% ~01s          
  |+++++++++++++++++++++                             | 40% ~01s          
  |+++++++++++++++++++++                             | 41% ~01s          
  |++++++++++++++++++++++                            | 42% ~01s          
  |++++++++++++++++++++++                            | 43% ~01s          
  |+++++++++++++++++++++++                           | 44% ~01s          
  |+++++++++++++++++++++++                           | 45% ~01s          
  |++++++++++++++++++++++++                          | 46% ~01s          
  |++++++++++++++++++++++++                          | 47% ~01s          
  |+++++++++++++++++++++++++                         | 48% ~01s          
  |+++++++++++++++++++++++++                         | 49% ~01s          
  |++++++++++++++++++++++++++                        | 51% ~01s          
  |++++++++++++++++++++++++++                        | 52% ~01s          
  |+++++++++++++++++++++++++++                       | 53% ~01s          
  |+++++++++++++++++++++++++++                       | 54% ~01s          
  |++++++++++++++++++++++++++++                      | 55% ~01s          
  |++++++++++++++++++++++++++++                      | 56% ~01s          
  |+++++++++++++++++++++++++++++                     | 57% ~01s          
  |+++++++++++++++++++++++++++++                     | 58% ~01s          
  |++++++++++++++++++++++++++++++                    | 59% ~01s          
  |++++++++++++++++++++++++++++++                    | 60% ~01s          
  |+++++++++++++++++++++++++++++++                   | 61% ~01s          
  |+++++++++++++++++++++++++++++++                   | 62% ~01s          
  |++++++++++++++++++++++++++++++++                  | 63% ~01s          
  |++++++++++++++++++++++++++++++++                  | 64% ~01s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~01s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~01s          
  |++++++++++++++++++++++++++++++++++                | 67% ~01s          
  |+++++++++++++++++++++++++++++++++++               | 68% ~01s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~01s          
  |++++++++++++++++++++++++++++++++++++              | 70% ~01s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~01s          
  |+++++++++++++++++++++++++++++++++++++             | 72% ~01s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~01s          
  |++++++++++++++++++++++++++++++++++++++            | 74% ~01s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~01s          
  |+++++++++++++++++++++++++++++++++++++++           | 76% ~01s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~01s          
  |++++++++++++++++++++++++++++++++++++++++          | 78% ~01s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++         | 80% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++        | 82% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=03s  
# Also want to plot these lineages on umap along with induced resistance genes
Idents(all_data) <- all_data$OG_condition
dabtram <- subset(all_data, idents = 'dabtram')
dabtram <- FindNeighbors(dabtram, dims = 1:10)
Computing nearest neighbor graph
Computing SNN
dabtram <- FindClusters(dabtram, resolution = 0.5)
Modularity Optimizer version 1.3.0 by Ludo Waltman and Nees Jan van Eck

Number of nodes: 3203
Number of edges: 108151

Running Louvain algorithm...
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Maximum modularity in 10 random starts: 0.8611
Number of communities: 7
Elapsed time: 0 seconds
dabtram <- RunUMAP(dabtram, dims = 1:10)
15:27:24 UMAP embedding parameters a = 0.9922 b = 1.112
15:27:24 Read 3203 rows and found 10 numeric columns
15:27:24 Using Annoy for neighbor search, n_neighbors = 30
15:27:24 Building Annoy index with metric = cosine, n_trees = 50
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
15:27:24 Writing NN index file to temp file /var/folders/ph/24prrxys02179y9_qzhxjgvc0000gn/T//Rtmp85KPIJ/file1376631b15490
15:27:24 Searching Annoy index using 1 thread, search_k = 3000
15:27:25 Annoy recall = 100%
15:27:26 Commencing smooth kNN distance calibration using 1 thread
15:27:28 Initializing from normalized Laplacian + noise
15:27:28 Commencing optimization for 500 epochs, with 133908 positive edges
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
15:27:33 Optimization finished
DimPlot(dabtram, reduction = 'umap')

FeaturePlot(dabtram, features = c("IGFBP5","COL1A1","CAV1"))

DimPlot(dabtram, cells.highlight = Dabtram_inducedto_CoCl2, cols.highlight = c('red'))

DimPlot(dabtram, cells.highlight = Dabtram_not_inducedto_CoCl2, cols.highlight = c('blue'))

Find gene expression markers of dabtram induced to cis

# Finding the lineages that end up induced resistant to cocl2, in the dabtram object
CoCl2_inducedto_Dabtram <- names(all_data$Lineage[all_data$OG_condition == 'cocl2' & all_data$Lineage %in% induced_resistant_lins$CoCl2_Inducedto_DabTram])
# Finding the lineages did not 
CoCl2_not_inducedto_Dabtram <- names(all_data$Lineage[all_data$OG_condition == 'cocl2' & all_data$Lineage %in% attr(dabtram_cocl2_venn, "intersections")$'cocl2'])

# Find induced markers
cocl2_inducedto_dabtram_markers <- FindMarkers(all_data, ident.1 = CoCl2_inducedto_Dabtram, ident.2 = CoCl2_not_inducedto_Dabtram, logfc.threshold = 0.25)

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~01s          
  |++                                                | 3 % ~00s          
  |+++                                               | 4 % ~00s          
  |+++                                               | 5 % ~00s          
  |++++                                              | 7 % ~00s          
  |+++++                                             | 8 % ~00s          
  |+++++                                             | 9 % ~00s          
  |++++++                                            | 11% ~00s          
  |+++++++                                           | 12% ~00s          
  |+++++++                                           | 14% ~00s          
  |++++++++                                          | 15% ~00s          
  |+++++++++                                         | 16% ~00s          
  |+++++++++                                         | 18% ~00s          
  |++++++++++                                        | 19% ~00s          
  |+++++++++++                                       | 20% ~00s          
  |+++++++++++                                       | 22% ~00s          
  |++++++++++++                                      | 23% ~00s          
  |+++++++++++++                                     | 24% ~00s          
  |+++++++++++++                                     | 26% ~00s          
  |++++++++++++++                                    | 27% ~00s          
  |+++++++++++++++                                   | 28% ~00s          
  |+++++++++++++++                                   | 30% ~00s          
  |++++++++++++++++                                  | 31% ~00s          
  |+++++++++++++++++                                 | 32% ~00s          
  |+++++++++++++++++                                 | 34% ~00s          
  |++++++++++++++++++                                | 35% ~00s          
  |+++++++++++++++++++                               | 36% ~00s          
  |+++++++++++++++++++                               | 38% ~00s          
  |++++++++++++++++++++                              | 39% ~00s          
  |+++++++++++++++++++++                             | 41% ~00s          
  |+++++++++++++++++++++                             | 42% ~00s          
  |++++++++++++++++++++++                            | 43% ~00s          
  |+++++++++++++++++++++++                           | 45% ~00s          
  |+++++++++++++++++++++++                           | 46% ~00s          
  |++++++++++++++++++++++++                          | 47% ~00s          
  |+++++++++++++++++++++++++                         | 49% ~00s          
  |+++++++++++++++++++++++++                         | 50% ~00s          
  |++++++++++++++++++++++++++                        | 51% ~00s          
  |+++++++++++++++++++++++++++                       | 53% ~00s          
  |++++++++++++++++++++++++++++                      | 54% ~00s          
  |++++++++++++++++++++++++++++                      | 55% ~00s          
  |+++++++++++++++++++++++++++++                     | 57% ~00s          
  |++++++++++++++++++++++++++++++                    | 58% ~00s          
  |++++++++++++++++++++++++++++++                    | 59% ~00s          
  |+++++++++++++++++++++++++++++++                   | 61% ~00s          
  |++++++++++++++++++++++++++++++++                  | 62% ~00s          
  |++++++++++++++++++++++++++++++++                  | 64% ~00s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~00s          
  |++++++++++++++++++++++++++++++++++                | 66% ~00s          
  |++++++++++++++++++++++++++++++++++                | 68% ~00s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~00s          
  |++++++++++++++++++++++++++++++++++++              | 70% ~00s          
  |++++++++++++++++++++++++++++++++++++              | 72% ~00s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~00s          
  |++++++++++++++++++++++++++++++++++++++            | 74% ~00s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~00s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~00s          
  |++++++++++++++++++++++++++++++++++++++++          | 78% ~00s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++        | 82% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 86% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=00s  
# Also want to plot these lineages on umap along with induced resistance genes
Idents(all_data) <- all_data$OG_condition
cocl2 <- subset(all_data, idents = 'cocl2')
cocl2 <- FindNeighbors(cocl2, dims = 1:10)
Computing nearest neighbor graph
Computing SNN
cocl2 <- FindClusters(cocl2, resolution = 0.5)
Modularity Optimizer version 1.3.0 by Ludo Waltman and Nees Jan van Eck

Number of nodes: 4823
Number of edges: 160093

Running Louvain algorithm...
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Maximum modularity in 10 random starts: 0.8374
Number of communities: 9
Elapsed time: 0 seconds
cocl2 <- RunUMAP(cocl2, dims = 1:10)
15:27:38 UMAP embedding parameters a = 0.9922 b = 1.112
15:27:38 Read 4823 rows and found 10 numeric columns
15:27:38 Using Annoy for neighbor search, n_neighbors = 30
15:27:38 Building Annoy index with metric = cosine, n_trees = 50
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
15:27:39 Writing NN index file to temp file /var/folders/ph/24prrxys02179y9_qzhxjgvc0000gn/T//Rtmp85KPIJ/file137667126d36c
15:27:39 Searching Annoy index using 1 thread, search_k = 3000
15:27:40 Annoy recall = 100%
15:27:41 Commencing smooth kNN distance calibration using 1 thread
15:27:43 Initializing from normalized Laplacian + noise
15:27:43 Commencing optimization for 500 epochs, with 195924 positive edges
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
15:27:50 Optimization finished
DimPlot(cocl2, reduction = 'umap')

FeaturePlot(cocl2, features = c("RAMP1","CYTL1","MT-CO3"))

DimPlot(cocl2, cells.highlight = CoCl2_inducedto_Dabtram, cols.highlight = c('red'))

DimPlot(cocl2, cells.highlight = CoCl2_not_inducedto_Dabtram, cols.highlight = c('blue'))

Find gene expression markers of cocl2 induced to cis

# Finding the lineages that end up induced resistant to cocl2, in the dabtram object
Dabtram_inducedto_Cis <- names(all_data$Lineage[all_data$OG_condition == 'dabtram' & all_data$Lineage %in% induced_resistant_lins$DabTram_Inducedto_Cis])
# Finding the lineages did not 
Dabtram_not_inducedto_Cis <- names(all_data$Lineage[all_data$OG_condition == 'dabtram' & all_data$Lineage %in% attr(dabtram_cis_venn, "intersections")$'dabtram'])

# Find induced markers
dabtram_inducedto_cis_markers <- FindMarkers(all_data, ident.1 = Dabtram_inducedto_Cis, ident.2 = Dabtram_not_inducedto_Cis, logfc.threshold = 0.25)

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~01s          
  |++                                                | 2 % ~00s          
  |++                                                | 3 % ~00s          
  |+++                                               | 5 % ~00s          
  |+++                                               | 6 % ~00s          
  |++++                                              | 7 % ~00s          
  |+++++                                             | 8 % ~00s          
  |+++++                                             | 9 % ~00s          
  |++++++                                            | 10% ~00s          
  |++++++                                            | 11% ~00s          
  |+++++++                                           | 13% ~00s          
  |+++++++                                           | 14% ~00s          
  |++++++++                                          | 15% ~00s          
  |+++++++++                                         | 16% ~00s          
  |+++++++++                                         | 17% ~00s          
  |++++++++++                                        | 18% ~00s          
  |++++++++++                                        | 20% ~00s          
  |+++++++++++                                       | 21% ~00s          
  |+++++++++++                                       | 22% ~00s          
  |++++++++++++                                      | 23% ~00s          
  |+++++++++++++                                     | 24% ~00s          
  |+++++++++++++                                     | 25% ~00s          
  |++++++++++++++                                    | 26% ~00s          
  |++++++++++++++                                    | 28% ~00s          
  |+++++++++++++++                                   | 29% ~00s          
  |+++++++++++++++                                   | 30% ~00s          
  |++++++++++++++++                                  | 31% ~00s          
  |+++++++++++++++++                                 | 32% ~00s          
  |+++++++++++++++++                                 | 33% ~00s          
  |++++++++++++++++++                                | 34% ~00s          
  |++++++++++++++++++                                | 36% ~00s          
  |+++++++++++++++++++                               | 37% ~00s          
  |+++++++++++++++++++                               | 38% ~00s          
  |++++++++++++++++++++                              | 39% ~00s          
  |+++++++++++++++++++++                             | 40% ~00s          
  |+++++++++++++++++++++                             | 41% ~00s          
  |++++++++++++++++++++++                            | 43% ~00s          
  |++++++++++++++++++++++                            | 44% ~00s          
  |+++++++++++++++++++++++                           | 45% ~00s          
  |+++++++++++++++++++++++                           | 46% ~00s          
  |++++++++++++++++++++++++                          | 47% ~00s          
  |+++++++++++++++++++++++++                         | 48% ~00s          
  |+++++++++++++++++++++++++                         | 49% ~00s          
  |++++++++++++++++++++++++++                        | 51% ~00s          
  |++++++++++++++++++++++++++                        | 52% ~00s          
  |+++++++++++++++++++++++++++                       | 53% ~00s          
  |++++++++++++++++++++++++++++                      | 54% ~00s          
  |++++++++++++++++++++++++++++                      | 55% ~00s          
  |+++++++++++++++++++++++++++++                     | 56% ~00s          
  |+++++++++++++++++++++++++++++                     | 57% ~00s          
  |++++++++++++++++++++++++++++++                    | 59% ~00s          
  |++++++++++++++++++++++++++++++                    | 60% ~00s          
  |+++++++++++++++++++++++++++++++                   | 61% ~00s          
  |++++++++++++++++++++++++++++++++                  | 62% ~00s          
  |++++++++++++++++++++++++++++++++                  | 63% ~00s          
  |+++++++++++++++++++++++++++++++++                 | 64% ~00s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~00s          
  |++++++++++++++++++++++++++++++++++                | 67% ~00s          
  |++++++++++++++++++++++++++++++++++                | 68% ~00s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~00s          
  |++++++++++++++++++++++++++++++++++++              | 70% ~00s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~00s          
  |+++++++++++++++++++++++++++++++++++++             | 72% ~00s          
  |+++++++++++++++++++++++++++++++++++++             | 74% ~00s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~00s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~00s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~00s          
  |++++++++++++++++++++++++++++++++++++++++          | 78% ~00s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++         | 80% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 86% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 94% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=00s  
# Also want to plot these lineages on umap along with induced resistance genes
Idents(all_data) <- all_data$OG_condition
dabtram <- subset(all_data, idents = 'dabtram')
dabtram <- FindNeighbors(dabtram, dims = 1:10)
Computing nearest neighbor graph
Computing SNN
dabtram <- FindClusters(dabtram, resolution = 0.5)
Modularity Optimizer version 1.3.0 by Ludo Waltman and Nees Jan van Eck

Number of nodes: 3203
Number of edges: 108151

Running Louvain algorithm...
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Maximum modularity in 10 random starts: 0.8611
Number of communities: 7
Elapsed time: 0 seconds
dabtram <- RunUMAP(dabtram, dims = 1:10)
15:27:55 UMAP embedding parameters a = 0.9922 b = 1.112
15:27:55 Read 3203 rows and found 10 numeric columns
15:27:55 Using Annoy for neighbor search, n_neighbors = 30
15:27:55 Building Annoy index with metric = cosine, n_trees = 50
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
15:27:55 Writing NN index file to temp file /var/folders/ph/24prrxys02179y9_qzhxjgvc0000gn/T//Rtmp85KPIJ/file137662c02917d
15:27:55 Searching Annoy index using 1 thread, search_k = 3000
15:27:56 Annoy recall = 100%
15:27:57 Commencing smooth kNN distance calibration using 1 thread
15:27:59 Initializing from normalized Laplacian + noise
15:27:59 Commencing optimization for 500 epochs, with 133908 positive edges
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
15:28:04 Optimization finished
DimPlot(dabtram, reduction = 'umap')

FeaturePlot(dabtram, features = c("PMEL","A2M","CTSK"))

DimPlot(dabtram, cells.highlight = Dabtram_inducedto_Cis, cols.highlight = c('red'))

DimPlot(dabtram, cells.highlight = Dabtram_not_inducedto_Cis, cols.highlight = c('blue'))

Find gene expression markers of cis induced to dabtram

# Finding the lineages that end up induced resistant to cocl2, in the cis object
CoCl2_inducedto_Cis <- names(all_data$Lineage[all_data$OG_condition == 'cocl2' & all_data$Lineage %in% induced_resistant_lins$CoCl2_Inducedto_Cis])
# Finding the lineages did not 
CoCl2_not_inducedto_Cis <- names(all_data$Lineage[all_data$OG_condition == 'cocl2' & all_data$Lineage %in% attr(cocl2_cis_venn, "intersections")$'cocl2'])

# Find induced markers
cocl2_inducedto_cis_markers <- FindMarkers(all_data, ident.1 = CoCl2_inducedto_Cis, ident.2 = CoCl2_not_inducedto_Cis, logfc.threshold = 0.25)

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~01s          
  |++                                                | 2 % ~01s          
  |++                                                | 3 % ~00s          
  |+++                                               | 4 % ~00s          
  |+++                                               | 5 % ~00s          
  |++++                                              | 7 % ~00s          
  |++++                                              | 8 % ~00s          
  |+++++                                             | 9 % ~00s          
  |+++++                                             | 10% ~00s          
  |++++++                                            | 11% ~00s          
  |+++++++                                           | 12% ~00s          
  |+++++++                                           | 13% ~00s          
  |++++++++                                          | 14% ~00s          
  |++++++++                                          | 15% ~00s          
  |+++++++++                                         | 16% ~00s          
  |+++++++++                                         | 18% ~00s          
  |++++++++++                                        | 19% ~00s          
  |++++++++++                                        | 20% ~00s          
  |+++++++++++                                       | 21% ~00s          
  |+++++++++++                                       | 22% ~00s          
  |++++++++++++                                      | 23% ~00s          
  |+++++++++++++                                     | 24% ~00s          
  |+++++++++++++                                     | 25% ~00s          
  |++++++++++++++                                    | 26% ~00s          
  |++++++++++++++                                    | 27% ~00s          
  |+++++++++++++++                                   | 29% ~00s          
  |+++++++++++++++                                   | 30% ~00s          
  |++++++++++++++++                                  | 31% ~00s          
  |++++++++++++++++                                  | 32% ~00s          
  |+++++++++++++++++                                 | 33% ~00s          
  |++++++++++++++++++                                | 34% ~00s          
  |++++++++++++++++++                                | 35% ~00s          
  |+++++++++++++++++++                               | 36% ~00s          
  |+++++++++++++++++++                               | 37% ~00s          
  |++++++++++++++++++++                              | 38% ~00s          
  |++++++++++++++++++++                              | 40% ~00s          
  |+++++++++++++++++++++                             | 41% ~00s          
  |+++++++++++++++++++++                             | 42% ~00s          
  |++++++++++++++++++++++                            | 43% ~00s          
  |++++++++++++++++++++++                            | 44% ~00s          
  |+++++++++++++++++++++++                           | 45% ~00s          
  |++++++++++++++++++++++++                          | 46% ~00s          
  |++++++++++++++++++++++++                          | 47% ~00s          
  |+++++++++++++++++++++++++                         | 48% ~00s          
  |+++++++++++++++++++++++++                         | 49% ~00s          
  |++++++++++++++++++++++++++                        | 51% ~00s          
  |++++++++++++++++++++++++++                        | 52% ~00s          
  |+++++++++++++++++++++++++++                       | 53% ~00s          
  |+++++++++++++++++++++++++++                       | 54% ~00s          
  |++++++++++++++++++++++++++++                      | 55% ~00s          
  |+++++++++++++++++++++++++++++                     | 56% ~00s          
  |+++++++++++++++++++++++++++++                     | 57% ~00s          
  |++++++++++++++++++++++++++++++                    | 58% ~00s          
  |++++++++++++++++++++++++++++++                    | 59% ~00s          
  |+++++++++++++++++++++++++++++++                   | 60% ~00s          
  |+++++++++++++++++++++++++++++++                   | 62% ~00s          
  |++++++++++++++++++++++++++++++++                  | 63% ~00s          
  |++++++++++++++++++++++++++++++++                  | 64% ~00s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~00s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~00s          
  |++++++++++++++++++++++++++++++++++                | 67% ~00s          
  |+++++++++++++++++++++++++++++++++++               | 68% ~00s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~00s          
  |++++++++++++++++++++++++++++++++++++              | 70% ~00s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~00s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~00s          
  |+++++++++++++++++++++++++++++++++++++             | 74% ~00s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~00s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~00s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~00s          
  |++++++++++++++++++++++++++++++++++++++++          | 78% ~00s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++         | 80% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++        | 82% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 90% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 92% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=00s  
# Also want to plot these lineages on umap along with induced resistance genes
Idents(all_data) <- all_data$OG_condition
cocl2 <- subset(all_data, idents = 'cocl2')
cocl2 <- FindNeighbors(cocl2, dims = 1:10)
Computing nearest neighbor graph
Computing SNN
cocl2 <- FindClusters(cocl2, resolution = 0.5)
Modularity Optimizer version 1.3.0 by Ludo Waltman and Nees Jan van Eck

Number of nodes: 4823
Number of edges: 160093

Running Louvain algorithm...
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Maximum modularity in 10 random starts: 0.8374
Number of communities: 9
Elapsed time: 0 seconds
cocl2 <- RunUMAP(cocl2, dims = 1:10)
15:28:10 UMAP embedding parameters a = 0.9922 b = 1.112
15:28:10 Read 4823 rows and found 10 numeric columns
15:28:10 Using Annoy for neighbor search, n_neighbors = 30
15:28:10 Building Annoy index with metric = cosine, n_trees = 50
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
15:28:10 Writing NN index file to temp file /var/folders/ph/24prrxys02179y9_qzhxjgvc0000gn/T//Rtmp85KPIJ/file137665c9dbc1d
15:28:10 Searching Annoy index using 1 thread, search_k = 3000
15:28:11 Annoy recall = 100%
15:28:12 Commencing smooth kNN distance calibration using 1 thread
15:28:14 Initializing from normalized Laplacian + noise
15:28:14 Commencing optimization for 500 epochs, with 195924 positive edges
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
15:28:21 Optimization finished
DimPlot(cocl2, reduction = 'umap')

FeaturePlot(cocl2, features = c("PMEL","A2M","CTSK"))

DimPlot(cocl2, cells.highlight = CoCl2_inducedto_Cis, cols.highlight = c('red'))

DimPlot(cocl2, cells.highlight = CoCl2_not_inducedto_Cis, cols.highlight = c('blue'))

Find gene expression markers of cis induced to cocl2

# Finding the lineages that end up induced resistant to cocl2, in the dabtram object
Cis_inducedto_Dabtram <- names(all_data$Lineage[all_data$OG_condition == 'cis' & all_data$Lineage %in% induced_resistant_lins$Cis_Inducedto_DabTram])
# Finding the lineages did not 
Cis_not_inducedto_Dabtram <- names(all_data$Lineage[all_data$OG_condition == 'cis' & all_data$Lineage %in% attr(dabtram_cis_venn, "intersections")$'cis'])

# Find induced markers
cis_inducedto_dabtram_markers <- FindMarkers(all_data, ident.1 = Cis_inducedto_Dabtram, ident.2 = Cis_not_inducedto_Dabtram, logfc.threshold = 0.25)

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~01s          
  |++                                                | 2 % ~01s          
  |++                                                | 3 % ~01s          
  |+++                                               | 4 % ~01s          
  |+++                                               | 5 % ~01s          
  |++++                                              | 6 % ~01s          
  |++++                                              | 7 % ~01s          
  |+++++                                             | 9 % ~01s          
  |+++++                                             | 10% ~01s          
  |++++++                                            | 11% ~01s          
  |++++++                                            | 12% ~01s          
  |+++++++                                           | 13% ~01s          
  |+++++++                                           | 14% ~01s          
  |++++++++                                          | 15% ~01s          
  |++++++++                                          | 16% ~01s          
  |+++++++++                                         | 17% ~01s          
  |++++++++++                                        | 18% ~01s          
  |++++++++++                                        | 19% ~01s          
  |+++++++++++                                       | 20% ~01s          
  |+++++++++++                                       | 21% ~01s          
  |++++++++++++                                      | 22% ~01s          
  |++++++++++++                                      | 23% ~01s          
  |+++++++++++++                                     | 24% ~01s          
  |+++++++++++++                                     | 26% ~01s          
  |++++++++++++++                                    | 27% ~01s          
  |++++++++++++++                                    | 28% ~01s          
  |+++++++++++++++                                   | 29% ~01s          
  |+++++++++++++++                                   | 30% ~01s          
  |++++++++++++++++                                  | 31% ~01s          
  |++++++++++++++++                                  | 32% ~01s          
  |+++++++++++++++++                                 | 33% ~01s          
  |++++++++++++++++++                                | 34% ~00s          
  |++++++++++++++++++                                | 35% ~00s          
  |+++++++++++++++++++                               | 36% ~00s          
  |+++++++++++++++++++                               | 37% ~00s          
  |++++++++++++++++++++                              | 38% ~00s          
  |++++++++++++++++++++                              | 39% ~00s          
  |+++++++++++++++++++++                             | 40% ~00s          
  |+++++++++++++++++++++                             | 41% ~00s          
  |++++++++++++++++++++++                            | 43% ~00s          
  |++++++++++++++++++++++                            | 44% ~00s          
  |+++++++++++++++++++++++                           | 45% ~00s          
  |+++++++++++++++++++++++                           | 46% ~00s          
  |++++++++++++++++++++++++                          | 47% ~00s          
  |++++++++++++++++++++++++                          | 48% ~00s          
  |+++++++++++++++++++++++++                         | 49% ~00s          
  |+++++++++++++++++++++++++                         | 50% ~00s          
  |++++++++++++++++++++++++++                        | 51% ~00s          
  |+++++++++++++++++++++++++++                       | 52% ~00s          
  |+++++++++++++++++++++++++++                       | 53% ~00s          
  |++++++++++++++++++++++++++++                      | 54% ~00s          
  |++++++++++++++++++++++++++++                      | 55% ~00s          
  |+++++++++++++++++++++++++++++                     | 56% ~00s          
  |+++++++++++++++++++++++++++++                     | 57% ~00s          
  |++++++++++++++++++++++++++++++                    | 59% ~00s          
  |++++++++++++++++++++++++++++++                    | 60% ~00s          
  |+++++++++++++++++++++++++++++++                   | 61% ~00s          
  |+++++++++++++++++++++++++++++++                   | 62% ~00s          
  |++++++++++++++++++++++++++++++++                  | 63% ~00s          
  |++++++++++++++++++++++++++++++++                  | 64% ~00s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~00s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~00s          
  |++++++++++++++++++++++++++++++++++                | 67% ~00s          
  |+++++++++++++++++++++++++++++++++++               | 68% ~00s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~00s          
  |++++++++++++++++++++++++++++++++++++              | 70% ~00s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~00s          
  |+++++++++++++++++++++++++++++++++++++             | 72% ~00s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~00s          
  |++++++++++++++++++++++++++++++++++++++            | 74% ~00s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~00s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~00s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~00s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~00s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 84% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 86% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 88% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 90% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=01s  
# Also want to plot these lineages on umap along with induced resistance genes
Idents(all_data) <- all_data$OG_condition
cis <- subset(all_data, idents = 'cis')
cis <- FindNeighbors(cis, dims = 1:10)
Computing nearest neighbor graph
Computing SNN
cis <- FindClusters(cis, resolution = 0.5)
Modularity Optimizer version 1.3.0 by Ludo Waltman and Nees Jan van Eck

Number of nodes: 8303
Number of edges: 244918

Running Louvain algorithm...
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
Maximum modularity in 10 random starts: 0.8046
Number of communities: 8
Elapsed time: 1 seconds
cis <- RunUMAP(cis, dims = 1:10)
15:28:29 UMAP embedding parameters a = 0.9922 b = 1.112
15:28:29 Read 8303 rows and found 10 numeric columns
15:28:29 Using Annoy for neighbor search, n_neighbors = 30
15:28:29 Building Annoy index with metric = cosine, n_trees = 50
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
15:28:30 Writing NN index file to temp file /var/folders/ph/24prrxys02179y9_qzhxjgvc0000gn/T//Rtmp85KPIJ/file1376677a9436b
15:28:30 Searching Annoy index using 1 thread, search_k = 3000
15:28:33 Annoy recall = 100%
15:28:33 Commencing smooth kNN distance calibration using 1 thread
15:28:35 Initializing from normalized Laplacian + noise
15:28:35 Commencing optimization for 500 epochs, with 350988 positive edges
0%   10   20   30   40   50   60   70   80   90   100%
[----|----|----|----|----|----|----|----|----|----|
**************************************************|
15:28:47 Optimization finished
DimPlot(cis, reduction = 'umap')

FeaturePlot(cis, features = c("HIST1H1D","CYP51A1","LDHA","HIST1H1B"))

DimPlot(cis, cells.highlight = Cis_inducedto_Dabtram, cols.highlight = c('red'))

DimPlot(cis, cells.highlight = Cis_not_inducedto_Dabtram, cols.highlight = c('blue'))

LS0tCnRpdGxlOiAiMjAyMl8wNl8xN19GaW5kIEluZHVjZWQgUmVzaXN0YW5jZSIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKI1NldCB3b3JraW5nIGRpcmVjdG9yeSB0byBhcHByb3ByaWF0ZSBmb2xkZXIgZm9yIGlucHV0cyBhbmQgb3V0cHV0cyBvbiBHb29nbGUgRHJpdmUKYGBge3IsIHNldHVwLCBpbmNsdWRlPUZBTFNFfQoja25pdHI6Om9wdHNfa25pdCRzZXQocm9vdC5kaXIgPSAnL1ZvbHVtZXMvR29vZ2xlRHJpdmUvTXkgRHJpdmUvRmFzc2VfU2hhcmVkL0FKRl9Ecml2ZV9jb3B5L0V4cGVyaW1lbnRzL0FKRjAwOScpICMgZm9yIGFyaWEncyBjb21wdXRlcgprbml0cjo6b3B0c19rbml0JHNldChyb290LmRpciA9ICcvVm9sdW1lcy9Hb29nbGVEcml2ZS8uc2hvcnRjdXQtdGFyZ2V0cy1ieS1pZC8xelNxeDNJelhNd3Q2Y2xVand5cW1sT2Y0RzFLNTNsdnkvRmFzc2VfU2hhcmVkL0FKRl9Ecml2ZV9jb3B5L0V4cGVyaW1lbnRzL0FKRjAwOScpICMgZm9yIGR5bGFuJ3MgY29tcHV0ZXIKCiMyMDIyXzAxXzE0X2FuYWx5c2lzX3NjcmlwdHMvMjAyMl8wNV8yN19hbmFseXNpcy9JbmR1Y2VkX1Jlc2lzdGFuY2UvIGlzIGFkZGl0aW9uYWwgcGF0aCBmb3Igb3V0cHV0cwoKYGBgCgojIEluaXRpYWxpemUKYGBge3IgaW5jbHVkZSA9IEZBTFNFfQpybShsaXN0ID0gbHMoKSkKbGlicmFyeShkcGx5cikKbGlicmFyeShTZXVyYXQpCmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShSQ29sb3JCcmV3ZXIpCmxpYnJhcnkoa2l0KQpsaWJyYXJ5KGNvd3Bsb3QpCmxpYnJhcnkodmVubikKYCVuaW4lYCA9IE5lZ2F0ZShgJWluJWApCgpgYGAKCiMgQXNzaWduIGRpcmVjdG9yeSBhbmQgbG9hZCBmaWxlcwpgYGB7ciBpbmNsdWRlID0gRkFMU0V9Cgpsb2FkKCcyMDIyXzAxXzE0X2FuYWx5c2lzX3NjcmlwdHMvMjAyMl8wNV8yN19hbmFseXNpcy9Bc3NpZ25fZG9taW5hbnRfYmFyY29kZXMvYWxsX2RhdGFfZmluYWxfbGluZWFnZXMuUkRhdGEnKSAjc2V1cmF0IG9iamVjdCB3aXRoIGZpbmFsIGxpbmVhZ2UgYXNzaWdubWVudHMKCmxvYWQoJzIwMjJfMDFfMTRfYW5hbHlzaXNfc2NyaXB0cy8yMDIyXzA1XzI3X2FuYWx5c2lzL1ByZXByb2Nlc3NfZ0ROQS9wcmVwcm9jZXNzZWRfZ0ROQS5SRGF0YScpICMgbmVlZCBsaXN0IG9mIGFsbCBnRE5BIHJlYWRzIHBlciBsaW5lYWdlCgpsb2FkKCcyMDIyXzAxXzE0X2FuYWx5c2lzX3NjcmlwdHMvMjAyMl8wNV8yN19hbmFseXNpcy9GaWx0ZXJpbmdfY0ROQS9maWx0ZXJlZF9jRE5BLlJEYXRhJykgIyBuZWVkIGxpc3Qgb2YgYWxsIGxpbmVhZ2VzIHdpdGggY0ROQSByZXByZXNlbnRhdGlvbgpsb2FkKCcyMDIyXzAxXzE0X2FuYWx5c2lzX3NjcmlwdHMvMjAyMl8wNV8yN19hbmFseXNpcy9GaWx0ZXJpbmdfY0ROQS9yZXNpc3RhbnRfbGluZWFnZV9saXN0cy5SRGF0YScpICMgbGlzdCBvZiBsaW5lYWdlcyBwYXNzaW5nIGZpbHRlcmluZwpsb2FkKCcyMDIyXzAxXzE0X2FuYWx5c2lzX3NjcmlwdHMvMjAyMl8wNV8yN19hbmFseXNpcy9Bc3NpZ25fZG9taW5hbnRfYmFyY29kZXMvYWxsX2RhdGFfZmluYWxfbGluZWFnZXMuUkRhdGEnKSAjIExvYWQgaW4gdGhlIHNpbmdsZSBjZWxsIG9iamVjdAoKYGBgCgoKIyBMb29rIGF0IG1hcmtlcnMgb2YgaW5kdWNlZCByZXNpc3RhbnQgbGluZWFnZXMgKHZlcnN1cyBhbGw/IHZlcnN1cyBzZW5zaXRpdmU/IGRpZmZlcmVuY2UgaXMgbGluZWFnZXMgdGhhdCB3ZXJlIHJlc2lzdGFudCB0byBib3RoIGluZGVwZW5kZW50bHkpCiMgZXhwcmVzc2lvbiBvZiBlbmQgcmVzaXN0YW50IHN0YXRlIG1hcmtlcnMgaW4gdGhlIGluZHVjZWQgcmVzaXN0YW50IGxpbmVhZ2VzCiMgZG8gY2VsbHMgZnJvbSB0aGVzZSBsaW5lYWdlcyBjbHVzdGVyIHRvZ2V0aGVyPwojIGFyZSBjZWxscyBmcm9tIHRoZXNlIGxpbmVhZ2VzIHJlc2lzdGFudCB0byBtYW55IG9yIGZldyBjb25kaXRpb25zPwojIGhvdyBlbHNlIGRvIHRoZXNlIGxpbmVhZ2VzIGRpc3Rpbmd1aXNoIHRoZW1zZWx2ZXM/CiMgZG8gd2Ugd2FudCB0byBkbyBhIHBhdGh3YXkgYW5hbHlzaXMgaGVyZT8KCiMgQnVpbGQgbmV3IG9iamVjdCB0aGF0IGRlZmluZXMgaW5kdWNlZCByZXNpc3RhbmNlIGZyb20gZ0ROQV9jb2xsYXBzZWQKIyBjcm9zcyBjaGVjayBhZ2FpbnN0IGdETkFfY0ROQV9jb2xsYXBzZWQgdG8gbG9vayBhdCB0aGluZ3Mgd2l0aCBjRE5BIHJlcHJlc2VudGF0aW9uCmBgYHtyfQoKbm9maWx0ZXJfZ0ROQV9saW5zIDwtIGxpc3QoKQpmb3IgKGkgaW4gbmFtZXMoZ0ROQV9jb2xsYXBzZWQpKXsKICBpZiAoaSAhPSAnRmlyc3RTYW1wbGUnKXsKICBub2ZpbHRlcl9nRE5BX2xpbnNbW2ldXSA8LSBnRE5BX2NvbGxhcHNlZFtbaV1dJExpbmVhZ2VbZ0ROQV9jb2xsYXBzZWRbW2ldXSRSZWFkcyA+IDFdCiAgfQp9CgoKZGFidHJhbV9jb2NsMiA8LSBsaXN0KGRhYnRyYW0gPSB1bmlxdWUoYyhub2ZpbHRlcl9nRE5BX2xpbnMkRGFiVHJhbSwgbm9maWx0ZXJfZ0ROQV9saW5zJERhYlRyYW10b0Npcywgbm9maWx0ZXJfZ0ROQV9saW5zJERhYlRyYW10b0NvQ2wyLCBub2ZpbHRlcl9nRE5BX2xpbnMkRGFiVHJhbXRvRGFiVHJhbSkpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgY29jbDIgPSB1bmlxdWUoYyhub2ZpbHRlcl9nRE5BX2xpbnMkQ29DbDIsIG5vZmlsdGVyX2dETkFfbGlucyRDb0NsMnRvQ2lzLCBub2ZpbHRlcl9nRE5BX2xpbnMkQ29DbDJ0b0NvQ2wyLCBub2ZpbHRlcl9nRE5BX2xpbnMkQ29DbDJ0b0RhYlRyYW0pKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgZGFidHJhbXRvY29jbDIgPSBub2ZpbHRlcl9nRE5BX2xpbnMkRGFiVHJhbXRvQ29DbDIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvY2wydG9kYWJ0cmFtID0gbm9maWx0ZXJfZ0ROQV9saW5zJENvQ2wydG9EYWJUcmFtKQoKZGFidHJhbV9jaXMgPC0gbGlzdChkYWJ0cmFtID0gdW5pcXVlKGMobm9maWx0ZXJfZ0ROQV9saW5zJERhYlRyYW0sIG5vZmlsdGVyX2dETkFfbGlucyREYWJUcmFtdG9DaXMsIG5vZmlsdGVyX2dETkFfbGlucyREYWJUcmFtdG9Db0NsMiwgbm9maWx0ZXJfZ0ROQV9saW5zJERhYlRyYW10b0RhYlRyYW0pKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICBjaXMgPSB1bmlxdWUoYyhub2ZpbHRlcl9nRE5BX2xpbnMkQ2lzLCBub2ZpbHRlcl9nRE5BX2xpbnMkQ2lzdG9DaXMsIG5vZmlsdGVyX2dETkFfbGlucyRDaXN0b0NvQ2wyLCBub2ZpbHRlcl9nRE5BX2xpbnMkQ2lzdG9EYWJUcmFtKSksCiAgICAgICAgICAgICAgICAgICAgICAgICBkYWJ0cmFtdG9jaXMgPSBub2ZpbHRlcl9nRE5BX2xpbnMkRGFiVHJhbXRvQ2lzLAogICAgICAgICAgICAgICAgICAgICAgICAgY2lzdG9kYWJ0cmFtID0gbm9maWx0ZXJfZ0ROQV9saW5zJENpc3RvRGFiVHJhbSkKCmNvY2wyX2NpcyA8LSBsaXN0KGNvY2wyID0gdW5pcXVlKGMobm9maWx0ZXJfZ0ROQV9saW5zJENvQ2wyLCBub2ZpbHRlcl9nRE5BX2xpbnMkQ29DbDJ0b0Npcywgbm9maWx0ZXJfZ0ROQV9saW5zJENvQ2wydG9Db0NsMiwgbm9maWx0ZXJfZ0ROQV9saW5zJENvQ2wydG9EYWJUcmFtKSksCiAgICAgICAgICAgICAgICAgICAgICAgY2lzID0gKGMobm9maWx0ZXJfZ0ROQV9saW5zJENpcywgbm9maWx0ZXJfZ0ROQV9saW5zJENpc3RvQ2lzLCBub2ZpbHRlcl9nRE5BX2xpbnMkQ2lzdG9Db0NsMiwgbm9maWx0ZXJfZ0ROQV9saW5zJENpc3RvRGFiVHJhbSkpLAogICAgICAgICAgICAgICAgICAgICAgIGNvY2wydG9jaXMgPSBub2ZpbHRlcl9nRE5BX2xpbnMkQ29DbDJ0b0NpcywKICAgICAgICAgICAgICAgICAgICAgICBjaXN0b2NvY2wyID0gbm9maWx0ZXJfZ0ROQV9saW5zJENpc3RvQ29DbDIpCgppbmR1Y2VkX3Jlc2lzdGFudF9saW5zIDwtIGxpc3QoKQoKZGFidHJhbV9jb2NsMl92ZW5uIDwtIHZlbm4oZGFidHJhbV9jb2NsMikKZGFidHJhbV9jaXNfdmVubiA8LSB2ZW5uKGRhYnRyYW1fY2lzKQpjb2NsMl9jaXNfdmVubiA8LSB2ZW5uKGNvY2wyX2NpcykKCmluZHVjZWRfcmVzaXN0YW50X2xpbnNbWydEYWJUcmFtX0luZHVjZWR0b19Db0NsMiddXSA9IGF0dHIoZGFidHJhbV9jb2NsMl92ZW5uLCAiaW50ZXJzZWN0aW9ucyIpJCdkYWJ0cmFtOmRhYnRyYW10b2NvY2wyJwppbmR1Y2VkX3Jlc2lzdGFudF9saW5zW1snQ29DbDJfSW5kdWNlZHRvX0RhYlRyYW0nXV0gPSBhdHRyKGRhYnRyYW1fY29jbDJfdmVubiwgImludGVyc2VjdGlvbnMiKSQnY29jbDI6Y29jbDJ0b2RhYnRyYW0nCgppbmR1Y2VkX3Jlc2lzdGFudF9saW5zW1snRGFiVHJhbV9JbmR1Y2VkdG9fQ2lzJ11dID0gYXR0cihkYWJ0cmFtX2Npc192ZW5uLCAiaW50ZXJzZWN0aW9ucyIpJCdkYWJ0cmFtOmRhYnRyYW10b2NpcycKaW5kdWNlZF9yZXNpc3RhbnRfbGluc1tbJ0Npc19JbmR1Y2VkdG9fRGFiVHJhbSddXSA9IGF0dHIoZGFidHJhbV9jaXNfdmVubiwgImludGVyc2VjdGlvbnMiKSQnY2lzOmNpc3RvZGFidHJhbScKCmluZHVjZWRfcmVzaXN0YW50X2xpbnNbWydDb0NsMl9JbmR1Y2VkdG9fQ2lzJ11dID0gYXR0cihjb2NsMl9jaXNfdmVubiwgImludGVyc2VjdGlvbnMiKSQnY29jbDI6Y29jbDJ0b2NpcycKaW5kdWNlZF9yZXNpc3RhbnRfbGluc1tbJ0Npc19JbmR1Y2VkdG9fQ29DbDInXV0gPSBhdHRyKGNvY2wyX2Npc192ZW5uLCAiaW50ZXJzZWN0aW9ucyIpJCdjaXM6Y2lzdG9jb2NsMicKCmBgYAojSG93IG1hbnkgcmVhZHMgZm9yIGVhY2ggb2YgdGhlc2UgbGluZWFnZXM/IEhvdyBtYW55IGNlbGxzPyBQbG90IGRpc3RyaWJ1dGlvbiBvZiBsaW5lYWdlIHNpemUgKGNlbGxzPyByZWFkcz8gd2hpY2ggdGltZT8pLCBjb3JyZWxhdGlvbiBiZXR3ZWVuIHRpbWUgMSBhbmQgMgpgYGB7cn0KaW5kdWNlZF9yZXNpc3RhbnRfZGYgPC0gbGlzdCgpCgpmb3IgKGkgaW4gbmFtZXMoaW5kdWNlZF9yZXNpc3RhbnRfbGlucykpewogIHNwbGl0IDwtIHN0cnNwbGl0KGksICdfJykKICB0aW1lMSA8LSBzcGxpdFtbMV1dWzFdCiAgdGltZTIgPC0gcGFzdGUwKHNwbGl0W1sxXV1bMV0sICd0bycsIHNwbGl0W1sxXV1bM10pCiAgCiAgdGVzdCA8LSBmaWx0ZXIoZ0ROQV9jb2xsYXBzZWRbW3RpbWUxXV0sIGdETkFfY29sbGFwc2VkW1t0aW1lMV1dJExpbmVhZ2UgJWluJSBpbmR1Y2VkX3Jlc2lzdGFudF9saW5zW1tpXV0pCiAgY29sbmFtZXModGVzdClbY29sbmFtZXModGVzdCkgPT0gIlJlYWRzIl0gPC0gIlJlYWRzX3RpbWUxIgogIGNvbG5hbWVzKHRlc3QpW2NvbG5hbWVzKHRlc3QpID09ICJSUE0iXSA8LSAiUlBNX3RpbWUxIgoKICB0ZXN0JE51bV9DZWxsc190aW1lMSA8LSByZXAoMCwgbGVuZ3RoKHRlc3QkTGluZWFnZSkpCiAgdGVzdCROdW1fQ2VsbHNfdGltZTIgPC0gcmVwKDAsIGxlbmd0aCh0ZXN0JExpbmVhZ2UpKQogIHRlc3QkUmVhZHNfdGltZTIgPC0gcmVwKDAsIGxlbmd0aCh0ZXN0JExpbmVhZ2UpKQogIAogIGZvciAoayBpbiAxOmxlbmd0aCh0ZXN0JExpbmVhZ2UpKXsKICAgIGxpbiA8LSB0ZXN0JExpbmVhZ2VbW2tdXQogIAogICAgaWYgKGlzLmVsZW1lbnQobGluLCBnRE5BX2NETkFfY29sbGFwc2VkW1t0aW1lMV1dJExpbmVhZ2UpKXsKICAgICAgdGVzdCROdW1fQ2VsbHNfdGltZTFbW2tdXSA8LSBnRE5BX2NETkFfY29sbGFwc2VkW1t0aW1lMV1dJE51bV9DZWxsc1tnRE5BX2NETkFfY29sbGFwc2VkW1t0aW1lMV1dJExpbmVhZ2UgPT0gbGluXQogICAgfQogICAgaWYgKGlzLmVsZW1lbnQobGluLCBnRE5BX2NETkFfY29sbGFwc2VkW1t0aW1lMl1dJExpbmVhZ2UpKXsKICAgICAgdGVzdCROdW1fQ2VsbHNfdGltZTJbW2tdXSA8LSBnRE5BX2NETkFfY29sbGFwc2VkW1t0aW1lMl1dJE51bV9DZWxsc1tnRE5BX2NETkFfY29sbGFwc2VkW1t0aW1lMl1dJExpbmVhZ2UgPT0gbGluXQogICAgfQogICAgdGVzdCRSZWFkc190aW1lMltba11dIDwtIGdETkFfY29sbGFwc2VkW1t0aW1lMl1dJFJlYWRzW2dETkFfY29sbGFwc2VkW1t0aW1lMl1dJExpbmVhZ2UgPT0gbGluXQogICAgCiAgICB0ZXN0JE51bV9DZWxsc190aW1lMV9ub3JtW1trXV0gPC0gdGVzdCROdW1fQ2VsbHNfdGltZTFbW2tdXSAvIGxlbmd0aChhbGxfZGF0YSRPR19jb25kaXRpb24gPT0gdGltZTEpCiAgICAKICB9CiAgaW5kdWNlZF9yZXNpc3RhbnRfZGZbW2ldXSA8LSB0ZXN0ICAKfQpgYGAKCiNwbG90dGluZyBjZWxsICMgY29ycmVsYXRpb24gYmV0d2VlbiB0aW1lIDEgYW5kIDIKYGBge3J9CmZvciAoaSBpbiBuYW1lcyhpbmR1Y2VkX3Jlc2lzdGFudF9kZikpewogIHByaW50KGdncGxvdChpbmR1Y2VkX3Jlc2lzdGFudF9kZltbaV1dLCBhZXMoeCA9IE51bV9DZWxsc190aW1lMiwgeSA9IE51bV9DZWxsc190aW1lMSkpICsgZ2VvbV9wb2ludCgpICsgZ2d0aXRsZShwYXN0ZSgicGVyIGxpbmVhZ2UgIyBjZWxscyBhdCB0aW1lIDEgdnMgdGltZSAyIGluIiwgaSkpKQp9CgojIGZvciAoaSBpbiBuYW1lcyhjRE5BX2V4Y2x1ZGVkKSl7CiMgICBwcmludChnZ3Bsb3QoZGF0YSA9IGNETkFfZXhjbHVkZWRbW2ldXSwgYWVzKHggPSBOdW1fQ2VsbHMpKSArIGdlb21fYmFyKCkgKyBsYWJzKHggPSAnTnVtYmVyIG9mIENlbGxzIHBlciBsaW5lYWdlJywgdGl0bGUgPSBwYXN0ZShpLCAiY0ROQSBsaW5lYWdlcyBsb3N0IGluIGZpbHRlcmluZyIpKSkKIyAgIHByaW50KGdncGxvdChkYXRhID0gZ0ROQV9jRE5BX2NvbGxhcHNlZFtbaV1dLCBhZXMoeCA9IE51bV9DZWxscykpICsgZ2VvbV9iYXIoKSArIGxhYnMoeCA9ICdOdW1iZXIgb2YgQ2VsbHMgcGVyIGxpbmVhZ2UgJywgdGl0bGUgPSBwYXN0ZShpLCAiY0ROQSBsaW5lYWdlcyBwcmlvciB0byBmaWx0ZXJpbmciKSkpICAgICAgCiMgfQojIGRldi5vZmYoKQoKYGBgCgojIEZpbmQgZ2VuZSBleHByZXNzaW9uIG1hcmtlcnMgb2YgZGFidHJhbSBpbmR1Y2VkIHRvIGNvY2wyCmBgYHtyfQojIEZpbmRpbmcgdGhlIGxpbmVhZ2VzIHRoYXQgZW5kIHVwIGluZHVjZWQgcmVzaXN0YW50IHRvIGNvY2wyLCBpbiB0aGUgZGFidHJhbSBvYmplY3QKRGFidHJhbV9pbmR1Y2VkdG9fQ29DbDIgPC0gbmFtZXMoYWxsX2RhdGEkTGluZWFnZVthbGxfZGF0YSRPR19jb25kaXRpb24gPT0gJ2RhYnRyYW0nICYgYWxsX2RhdGEkTGluZWFnZSAlaW4lIGluZHVjZWRfcmVzaXN0YW50X2xpbnMkRGFiVHJhbV9JbmR1Y2VkdG9fQ29DbDJdKQojIEZpbmRpbmcgdGhlIGxpbmVhZ2VzIGRpZCBub3QgCkRhYnRyYW1fbm90X2luZHVjZWR0b19Db0NsMiA8LSBuYW1lcyhhbGxfZGF0YSRMaW5lYWdlW2FsbF9kYXRhJE9HX2NvbmRpdGlvbiA9PSAnZGFidHJhbScgJiBhbGxfZGF0YSRMaW5lYWdlICVpbiUgYXR0cihkYWJ0cmFtX2NvY2wyX3Zlbm4sICJpbnRlcnNlY3Rpb25zIikkJ2RhYnRyYW0nXSkKCiMgRmluZCBpbmR1Y2VkIG1hcmtlcnMKZGFidHJhbV9pbmR1Y2VkdG9fY29jbDJfbWFya2VycyA8LSBGaW5kTWFya2VycyhhbGxfZGF0YSwgaWRlbnQuMSA9IERhYnRyYW1faW5kdWNlZHRvX0NvQ2wyLCBpZGVudC4yID0gRGFidHJhbV9ub3RfaW5kdWNlZHRvX0NvQ2wyLCBsb2dmYy50aHJlc2hvbGQgPSAwLjI1KQoKIyBBbHNvIHdhbnQgdG8gcGxvdCB0aGVzZSBsaW5lYWdlcyBvbiB1bWFwIGFsb25nIHdpdGggaW5kdWNlZCByZXNpc3RhbmNlIGdlbmVzCklkZW50cyhhbGxfZGF0YSkgPC0gYWxsX2RhdGEkT0dfY29uZGl0aW9uCmRhYnRyYW0gPC0gc3Vic2V0KGFsbF9kYXRhLCBpZGVudHMgPSAnZGFidHJhbScpCmRhYnRyYW0gPC0gRmluZE5laWdoYm9ycyhkYWJ0cmFtLCBkaW1zID0gMToxMCkKZGFidHJhbSA8LSBGaW5kQ2x1c3RlcnMoZGFidHJhbSwgcmVzb2x1dGlvbiA9IDAuNSkKZGFidHJhbSA8LSBSdW5VTUFQKGRhYnRyYW0sIGRpbXMgPSAxOjEwKQpEaW1QbG90KGRhYnRyYW0sIHJlZHVjdGlvbiA9ICd1bWFwJykKRmVhdHVyZVBsb3QoZGFidHJhbSwgZmVhdHVyZXMgPSBjKCJJR0ZCUDUiLCJDT0wxQTEiLCJDQVYxIikpCkRpbVBsb3QoZGFidHJhbSwgY2VsbHMuaGlnaGxpZ2h0ID0gRGFidHJhbV9pbmR1Y2VkdG9fQ29DbDIsIGNvbHMuaGlnaGxpZ2h0ID0gYygncmVkJykpCkRpbVBsb3QoZGFidHJhbSwgY2VsbHMuaGlnaGxpZ2h0ID0gRGFidHJhbV9ub3RfaW5kdWNlZHRvX0NvQ2wyLCBjb2xzLmhpZ2hsaWdodCA9IGMoJ2JsdWUnKSkKYGBgCgojIEZpbmQgZ2VuZSBleHByZXNzaW9uIG1hcmtlcnMgb2YgY29jbDIgaW5kdWNlZCB0byBkYWJ0cmFtCmBgYHtyfQojIEZpbmRpbmcgdGhlIGxpbmVhZ2VzIHRoYXQgZW5kIHVwIGluZHVjZWQgcmVzaXN0YW50IHRvIGNvY2wyLCBpbiB0aGUgZGFidHJhbSBvYmplY3QKQ29DbDJfaW5kdWNlZHRvX0RhYnRyYW0gPC0gbmFtZXMoYWxsX2RhdGEkTGluZWFnZVthbGxfZGF0YSRPR19jb25kaXRpb24gPT0gJ2NvY2wyJyAmIGFsbF9kYXRhJExpbmVhZ2UgJWluJSBpbmR1Y2VkX3Jlc2lzdGFudF9saW5zJENvQ2wyX0luZHVjZWR0b19EYWJUcmFtXSkKIyBGaW5kaW5nIHRoZSBsaW5lYWdlcyBkaWQgbm90IApDb0NsMl9ub3RfaW5kdWNlZHRvX0RhYnRyYW0gPC0gbmFtZXMoYWxsX2RhdGEkTGluZWFnZVthbGxfZGF0YSRPR19jb25kaXRpb24gPT0gJ2NvY2wyJyAmIGFsbF9kYXRhJExpbmVhZ2UgJWluJSBhdHRyKGRhYnRyYW1fY29jbDJfdmVubiwgImludGVyc2VjdGlvbnMiKSQnY29jbDInXSkKCiMgRmluZCBpbmR1Y2VkIG1hcmtlcnMKY29jbDJfaW5kdWNlZHRvX2RhYnRyYW1fbWFya2VycyA8LSBGaW5kTWFya2VycyhhbGxfZGF0YSwgaWRlbnQuMSA9IENvQ2wyX2luZHVjZWR0b19EYWJ0cmFtLCBpZGVudC4yID0gQ29DbDJfbm90X2luZHVjZWR0b19EYWJ0cmFtLCBsb2dmYy50aHJlc2hvbGQgPSAwLjI1KQoKIyBBbHNvIHdhbnQgdG8gcGxvdCB0aGVzZSBsaW5lYWdlcyBvbiB1bWFwIGFsb25nIHdpdGggaW5kdWNlZCByZXNpc3RhbmNlIGdlbmVzCklkZW50cyhhbGxfZGF0YSkgPC0gYWxsX2RhdGEkT0dfY29uZGl0aW9uCmNvY2wyIDwtIHN1YnNldChhbGxfZGF0YSwgaWRlbnRzID0gJ2NvY2wyJykKY29jbDIgPC0gRmluZE5laWdoYm9ycyhjb2NsMiwgZGltcyA9IDE6MTApCmNvY2wyIDwtIEZpbmRDbHVzdGVycyhjb2NsMiwgcmVzb2x1dGlvbiA9IDAuNSkKY29jbDIgPC0gUnVuVU1BUChjb2NsMiwgZGltcyA9IDE6MTApCkRpbVBsb3QoY29jbDIsIHJlZHVjdGlvbiA9ICd1bWFwJykKRmVhdHVyZVBsb3QoY29jbDIsIGZlYXR1cmVzID0gYygiUkFNUDEiLCJDWVRMMSIsIk1ULUNPMyIpKQpEaW1QbG90KGNvY2wyLCBjZWxscy5oaWdobGlnaHQgPSBDb0NsMl9pbmR1Y2VkdG9fRGFidHJhbSwgY29scy5oaWdobGlnaHQgPSBjKCdyZWQnKSkKRGltUGxvdChjb2NsMiwgY2VsbHMuaGlnaGxpZ2h0ID0gQ29DbDJfbm90X2luZHVjZWR0b19EYWJ0cmFtLCBjb2xzLmhpZ2hsaWdodCA9IGMoJ2JsdWUnKSkKYGBgCgojIEZpbmQgZ2VuZSBleHByZXNzaW9uIG1hcmtlcnMgb2YgZGFidHJhbSBpbmR1Y2VkIHRvIGNpcwpgYGB7cn0KIyBGaW5kaW5nIHRoZSBsaW5lYWdlcyB0aGF0IGVuZCB1cCBpbmR1Y2VkIHJlc2lzdGFudCB0byBjb2NsMiwgaW4gdGhlIGRhYnRyYW0gb2JqZWN0CkRhYnRyYW1faW5kdWNlZHRvX0NpcyA8LSBuYW1lcyhhbGxfZGF0YSRMaW5lYWdlW2FsbF9kYXRhJE9HX2NvbmRpdGlvbiA9PSAnZGFidHJhbScgJiBhbGxfZGF0YSRMaW5lYWdlICVpbiUgaW5kdWNlZF9yZXNpc3RhbnRfbGlucyREYWJUcmFtX0luZHVjZWR0b19DaXNdKQojIEZpbmRpbmcgdGhlIGxpbmVhZ2VzIGRpZCBub3QgCkRhYnRyYW1fbm90X2luZHVjZWR0b19DaXMgPC0gbmFtZXMoYWxsX2RhdGEkTGluZWFnZVthbGxfZGF0YSRPR19jb25kaXRpb24gPT0gJ2RhYnRyYW0nICYgYWxsX2RhdGEkTGluZWFnZSAlaW4lIGF0dHIoZGFidHJhbV9jaXNfdmVubiwgImludGVyc2VjdGlvbnMiKSQnZGFidHJhbSddKQoKIyBGaW5kIGluZHVjZWQgbWFya2VycwpkYWJ0cmFtX2luZHVjZWR0b19jaXNfbWFya2VycyA8LSBGaW5kTWFya2VycyhhbGxfZGF0YSwgaWRlbnQuMSA9IERhYnRyYW1faW5kdWNlZHRvX0NpcywgaWRlbnQuMiA9IERhYnRyYW1fbm90X2luZHVjZWR0b19DaXMsIGxvZ2ZjLnRocmVzaG9sZCA9IDAuMjUpCgojIEFsc28gd2FudCB0byBwbG90IHRoZXNlIGxpbmVhZ2VzIG9uIHVtYXAgYWxvbmcgd2l0aCBpbmR1Y2VkIHJlc2lzdGFuY2UgZ2VuZXMKSWRlbnRzKGFsbF9kYXRhKSA8LSBhbGxfZGF0YSRPR19jb25kaXRpb24KZGFidHJhbSA8LSBzdWJzZXQoYWxsX2RhdGEsIGlkZW50cyA9ICdkYWJ0cmFtJykKZGFidHJhbSA8LSBGaW5kTmVpZ2hib3JzKGRhYnRyYW0sIGRpbXMgPSAxOjEwKQpkYWJ0cmFtIDwtIEZpbmRDbHVzdGVycyhkYWJ0cmFtLCByZXNvbHV0aW9uID0gMC41KQpkYWJ0cmFtIDwtIFJ1blVNQVAoZGFidHJhbSwgZGltcyA9IDE6MTApCkRpbVBsb3QoZGFidHJhbSwgcmVkdWN0aW9uID0gJ3VtYXAnKQpGZWF0dXJlUGxvdChkYWJ0cmFtLCBmZWF0dXJlcyA9IGMoIlBNRUwiLCJBMk0iLCJDVFNLIikpCkRpbVBsb3QoZGFidHJhbSwgY2VsbHMuaGlnaGxpZ2h0ID0gRGFidHJhbV9pbmR1Y2VkdG9fQ2lzLCBjb2xzLmhpZ2hsaWdodCA9IGMoJ3JlZCcpKQpEaW1QbG90KGRhYnRyYW0sIGNlbGxzLmhpZ2hsaWdodCA9IERhYnRyYW1fbm90X2luZHVjZWR0b19DaXMsIGNvbHMuaGlnaGxpZ2h0ID0gYygnYmx1ZScpKQpgYGAKCiMgRmluZCBnZW5lIGV4cHJlc3Npb24gbWFya2VycyBvZiBjb2NsMiBpbmR1Y2VkIHRvIGNpcwpgYGB7cn0KIyBGaW5kaW5nIHRoZSBsaW5lYWdlcyB0aGF0IGVuZCB1cCBpbmR1Y2VkIHJlc2lzdGFudCB0byBjb2NsMiwgaW4gdGhlIGNpcyBvYmplY3QKQ29DbDJfaW5kdWNlZHRvX0NpcyA8LSBuYW1lcyhhbGxfZGF0YSRMaW5lYWdlW2FsbF9kYXRhJE9HX2NvbmRpdGlvbiA9PSAnY29jbDInICYgYWxsX2RhdGEkTGluZWFnZSAlaW4lIGluZHVjZWRfcmVzaXN0YW50X2xpbnMkQ29DbDJfSW5kdWNlZHRvX0Npc10pCiMgRmluZGluZyB0aGUgbGluZWFnZXMgZGlkIG5vdCAKQ29DbDJfbm90X2luZHVjZWR0b19DaXMgPC0gbmFtZXMoYWxsX2RhdGEkTGluZWFnZVthbGxfZGF0YSRPR19jb25kaXRpb24gPT0gJ2NvY2wyJyAmIGFsbF9kYXRhJExpbmVhZ2UgJWluJSBhdHRyKGNvY2wyX2Npc192ZW5uLCAiaW50ZXJzZWN0aW9ucyIpJCdjb2NsMiddKQoKIyBGaW5kIGluZHVjZWQgbWFya2Vycwpjb2NsMl9pbmR1Y2VkdG9fY2lzX21hcmtlcnMgPC0gRmluZE1hcmtlcnMoYWxsX2RhdGEsIGlkZW50LjEgPSBDb0NsMl9pbmR1Y2VkdG9fQ2lzLCBpZGVudC4yID0gQ29DbDJfbm90X2luZHVjZWR0b19DaXMsIGxvZ2ZjLnRocmVzaG9sZCA9IDAuMjUpCgojIEFsc28gd2FudCB0byBwbG90IHRoZXNlIGxpbmVhZ2VzIG9uIHVtYXAgYWxvbmcgd2l0aCBpbmR1Y2VkIHJlc2lzdGFuY2UgZ2VuZXMKSWRlbnRzKGFsbF9kYXRhKSA8LSBhbGxfZGF0YSRPR19jb25kaXRpb24KY29jbDIgPC0gc3Vic2V0KGFsbF9kYXRhLCBpZGVudHMgPSAnY29jbDInKQpjb2NsMiA8LSBGaW5kTmVpZ2hib3JzKGNvY2wyLCBkaW1zID0gMToxMCkKY29jbDIgPC0gRmluZENsdXN0ZXJzKGNvY2wyLCByZXNvbHV0aW9uID0gMC41KQpjb2NsMiA8LSBSdW5VTUFQKGNvY2wyLCBkaW1zID0gMToxMCkKRGltUGxvdChjb2NsMiwgcmVkdWN0aW9uID0gJ3VtYXAnKQpGZWF0dXJlUGxvdChjb2NsMiwgZmVhdHVyZXMgPSBjKCJQTUVMIiwiQTJNIiwiQ1RTSyIpKQpEaW1QbG90KGNvY2wyLCBjZWxscy5oaWdobGlnaHQgPSBDb0NsMl9pbmR1Y2VkdG9fQ2lzLCBjb2xzLmhpZ2hsaWdodCA9IGMoJ3JlZCcpKQpEaW1QbG90KGNvY2wyLCBjZWxscy5oaWdobGlnaHQgPSBDb0NsMl9ub3RfaW5kdWNlZHRvX0NpcywgY29scy5oaWdobGlnaHQgPSBjKCdibHVlJykpCmBgYAoKIyBGaW5kIGdlbmUgZXhwcmVzc2lvbiBtYXJrZXJzIG9mIGNpcyBpbmR1Y2VkIHRvIGRhYnRyYW0KYGBge3J9CiMgRmluZGluZyB0aGUgbGluZWFnZXMgdGhhdCBlbmQgdXAgaW5kdWNlZCByZXNpc3RhbnQgdG8gY29jbDIsIGluIHRoZSBkYWJ0cmFtIG9iamVjdApDaXNfaW5kdWNlZHRvX0RhYnRyYW0gPC0gbmFtZXMoYWxsX2RhdGEkTGluZWFnZVthbGxfZGF0YSRPR19jb25kaXRpb24gPT0gJ2NpcycgJiBhbGxfZGF0YSRMaW5lYWdlICVpbiUgaW5kdWNlZF9yZXNpc3RhbnRfbGlucyRDaXNfSW5kdWNlZHRvX0RhYlRyYW1dKQojIEZpbmRpbmcgdGhlIGxpbmVhZ2VzIGRpZCBub3QgCkNpc19ub3RfaW5kdWNlZHRvX0RhYnRyYW0gPC0gbmFtZXMoYWxsX2RhdGEkTGluZWFnZVthbGxfZGF0YSRPR19jb25kaXRpb24gPT0gJ2NpcycgJiBhbGxfZGF0YSRMaW5lYWdlICVpbiUgYXR0cihkYWJ0cmFtX2Npc192ZW5uLCAiaW50ZXJzZWN0aW9ucyIpJCdjaXMnXSkKCiMgRmluZCBpbmR1Y2VkIG1hcmtlcnMKY2lzX2luZHVjZWR0b19kYWJ0cmFtX21hcmtlcnMgPC0gRmluZE1hcmtlcnMoYWxsX2RhdGEsIGlkZW50LjEgPSBDaXNfaW5kdWNlZHRvX0RhYnRyYW0sIGlkZW50LjIgPSBDaXNfbm90X2luZHVjZWR0b19EYWJ0cmFtLCBsb2dmYy50aHJlc2hvbGQgPSAwLjI1KQoKIyBBbHNvIHdhbnQgdG8gcGxvdCB0aGVzZSBsaW5lYWdlcyBvbiB1bWFwIGFsb25nIHdpdGggaW5kdWNlZCByZXNpc3RhbmNlIGdlbmVzCklkZW50cyhhbGxfZGF0YSkgPC0gYWxsX2RhdGEkT0dfY29uZGl0aW9uCmNpcyA8LSBzdWJzZXQoYWxsX2RhdGEsIGlkZW50cyA9ICdjaXMnKQpjaXMgPC0gRmluZE5laWdoYm9ycyhjaXMsIGRpbXMgPSAxOjEwKQpjaXMgPC0gRmluZENsdXN0ZXJzKGNpcywgcmVzb2x1dGlvbiA9IDAuNSkKY2lzIDwtIFJ1blVNQVAoY2lzLCBkaW1zID0gMToxMCkKRGltUGxvdChjaXMsIHJlZHVjdGlvbiA9ICd1bWFwJykKRmVhdHVyZVBsb3QoY2lzLCBmZWF0dXJlcyA9IGMoIkhJU1QxSDFEIiwiQ1lQNTFBMSIsIkxESEEiLCJISVNUMUgxQiIpKQpEaW1QbG90KGNpcywgY2VsbHMuaGlnaGxpZ2h0ID0gQ2lzX2luZHVjZWR0b19EYWJ0cmFtLCBjb2xzLmhpZ2hsaWdodCA9IGMoJ3JlZCcpKQpEaW1QbG90KGNpcywgY2VsbHMuaGlnaGxpZ2h0ID0gQ2lzX25vdF9pbmR1Y2VkdG9fRGFidHJhbSwgY29scy5oaWdobGlnaHQgPSBjKCdibHVlJykpCmBgYAojIEZpbmQgZ2VuZSBleHByZXNzaW9uIG1hcmtlcnMgb2YgY2lzIGluZHVjZWQgdG8gY29jbDIKYGBge3J9CiMgRmluZGluZyB0aGUgbGluZWFnZXMgdGhhdCBlbmQgdXAgaW5kdWNlZCByZXNpc3RhbnQgdG8gY29jbDIsIGluIHRoZSBkYWJ0cmFtIG9iamVjdApDaXNfaW5kdWNlZHRvX0NvQ2wyIDwtIG5hbWVzKGFsbF9kYXRhJExpbmVhZ2VbYWxsX2RhdGEkT0dfY29uZGl0aW9uID09ICdjaXMnICYgYWxsX2RhdGEkTGluZWFnZSAlaW4lIGluZHVjZWRfcmVzaXN0YW50X2xpbnMkQ2lzX0luZHVjZWR0b19Db0NsMl0pCiMgRmluZGluZyB0aGUgbGluZWFnZXMgZGlkIG5vdCAKQ2lzX25vdF9pbmR1Y2VkdG9fQ29DbDIgPC0gbmFtZXMoYWxsX2RhdGEkTGluZWFnZVthbGxfZGF0YSRPR19jb25kaXRpb24gPT0gJ2NpcycgJiBhbGxfZGF0YSRMaW5lYWdlICVpbiUgYXR0cihjb2NsMl9jaXNfdmVubiwgImludGVyc2VjdGlvbnMiKSQnY2lzJ10pCgojIEZpbmQgaW5kdWNlZCBtYXJrZXJzCmNpc19pbmR1Y2VkdG9fY29jbDJfbWFya2VycyA8LSBGaW5kTWFya2VycyhhbGxfZGF0YSwgaWRlbnQuMSA9IENpc19pbmR1Y2VkdG9fQ29DbDIsIGlkZW50LjIgPSBDaXNfbm90X2luZHVjZWR0b19Db0NsMiwgbG9nZmMudGhyZXNob2xkID0gMC4yNSkKCiMgQWxzbyB3YW50IHRvIHBsb3QgdGhlc2UgbGluZWFnZXMgb24gdW1hcCBhbG9uZyB3aXRoIGluZHVjZWQgcmVzaXN0YW5jZSBnZW5lcwpJZGVudHMoYWxsX2RhdGEpIDwtIGFsbF9kYXRhJE9HX2NvbmRpdGlvbgpjaXMgPC0gc3Vic2V0KGFsbF9kYXRhLCBpZGVudHMgPSAnY2lzJykKY2lzIDwtIEZpbmROZWlnaGJvcnMoY2lzLCBkaW1zID0gMToxMCkKY2lzIDwtIEZpbmRDbHVzdGVycyhjaXMsIHJlc29sdXRpb24gPSAwLjUpCmNpcyA8LSBSdW5VTUFQKGNpcywgZGltcyA9IDE6MTApCkRpbVBsb3QoY2lzLCByZWR1Y3Rpb24gPSAndW1hcCcpCkZlYXR1cmVQbG90KGNpcywgZmVhdHVyZXMgPSBjKCJDWVA1MUExIiwiTUtJNjciLCJCTklQMyIsIlBHSzEiKSkKRGltUGxvdChjaXMsIGNlbGxzLmhpZ2hsaWdodCA9IENpc19pbmR1Y2VkdG9fQ29DbDIsIGNvbHMuaGlnaGxpZ2h0ID0gYygncmVkJykpCkRpbVBsb3QoY2lzLCBjZWxscy5oaWdobGlnaHQgPSBDaXNfbm90X2luZHVjZWR0b19Db0NsMiwgY29scy5oaWdobGlnaHQgPSBjKCdibHVlJykpCmBgYAoKPCEtLSAjIERhYiBpbmR1Y2VkIHRvIENpcyAtLT4KPCEtLSBgYGB7cn0gLS0+CjwhLS0gRGFidHJhbV9ub3RfaW5kdWNlZHRvX0NpcyA8LSBuYW1lcyhkYWJ0cmFtJG9yaWcuaWRlbnRbZGFidHJhbSRMaW5lYWdlICVuaW4lIGMoZmluYWxfaW5kdWNlZF9yZXNpc3RhbnRfbGlucyREYWJ0cmFtX0luZHVjZWR0b19DaXMsIk5vIEJhcmNvZGUiLCJTdGlsbCBtdWx0aXBsZSIpIF0pICAtLT4KPCEtLSBEYWJ0cmFtX2luZHVjZWR0b19DaXMgPC0gbmFtZXMoZGFidHJhbSRvcmlnLmlkZW50W2RhYnRyYW0kTGluZWFnZSAlaW4lIGZpbmFsX2luZHVjZWRfcmVzaXN0YW50X2xpbnMkRGFidHJhbV9JbmR1Y2VkdG9fQ2lzXSkgLS0+Cgo8IS0tICMgR2V0IG1hcmtlcnMgb2YgZGFicmFmZW5pYiBpbmR1Y2VkIHRvIGNvY2wyIHJlc2lzdGFuY2UgLS0+CjwhLS0gRGFidHJhbV9pbmR1Y2VkdG9fQ2lzX21hcmtlcnMgPC0gRmluZE1hcmtlcnMoZGFidHJhbSwgaWRlbnQuMSA9IERhYnRyYW1faW5kdWNlZHRvX0NpcywgaWRlbnQuMiA9IERhYnRyYW1fbm90X2luZHVjZWR0b19DaXMsIGxvZ2ZjLnRocmVzaG9sZCA9IDAuMjUpIC0tPgoKPCEtLSAjIG1ha2UgbWV0YWRhdGEgb2JqZWN0IGZvciBkYWJyYWZlbmliIGluZHVjZWQgdG8gY29jbDIgcmVzaXN0YW5jZSAtLT4KPCEtLSBkYWJ0cmFtX2luZHVjZWR0b19jaXNfZm9ydmxuIDwtIHJlcCgwLCBsZW5ndGgobmFtZXMoZGFidHJhbSRMaW5lYWdlKSkpIC0tPgo8IS0tIGRhYnRyYW1faW5kdWNlZHRvX2Npc19mb3J2bG5bd2hpY2goZGFidHJhbSRMaW5lYWdlICVuaW4lIGMoZmluYWxfaW5kdWNlZF9yZXNpc3RhbnRfbGlucyREYWJ0cmFtX0luZHVjZWR0b19DaXMsIk5vIEJhcmNvZGUiLCJTdGlsbCBtdWx0aXBsZSIpKV0gPC0gJ1NlbnNpdGl2ZScgLS0+CjwhLS0gZGFidHJhbV9pbmR1Y2VkdG9fY2lzX2ZvcnZsblt3aGljaChkYWJ0cmFtJExpbmVhZ2UgJWluJSBjKGZpbmFsX2luZHVjZWRfcmVzaXN0YW50X2xpbnMkRGFidHJhbV9JbmR1Y2VkdG9fQ2lzKSldIDwtICdJbmR1Y2VkIFJlc2lzdGFudCcgLS0+CjwhLS0gZGFidHJhbV9pbmR1Y2VkdG9fY2lzX2ZvcnZsblt3aGljaChkYWJ0cmFtJExpbmVhZ2UgJWluJSBjKCJObyBCYXJjb2RlIiwiU3RpbGwgbXVsdGlwbGUiKSldIDwtICdObyBCYXJjb2RlJyAtLT4KPCEtLSBkYWJ0cmFtJERhYnRyYW1faW5kdWNlZHRvX0NpcyA8LSBkYWJ0cmFtX2luZHVjZWR0b19jaXNfZm9ydmxuIC0tPgo8IS0tIElkZW50cyhkYWJ0cmFtKSA8LSBkYWJ0cmFtJERhYnRyYW1faW5kdWNlZHRvX0NpcyAtLT4KCjwhLS0gYGBgIC0tPgoKPCEtLSAjIFBsb3QgdGhlIERhYiByZXNpc3RhbnQgY2VsbHMgb24gbmFpdmUgdW1hcCAtLT4KPCEtLSBgYGB7ciBpbmNsdWRlID0gRkFMU0V9IC0tPgo8IS0tIHBkZignMjAyMl8wMV8xNF9hbmFseXNpc19zY3JpcHRzLzIwMjJfMDVfMjdfYW5hbHlzaXMvSW5kdWNlZF9SZXNpc3RhbmNlL2RhYnRyYW1faW5kdWNlZHRvX2Npc19NYXJrZXJzLnBkZicpIC0tPgo8IS0tIERpbVBsb3QoZGFidHJhbSwgcmVkdWN0aW9uID0gInVtYXAiLCBkaW1zID0gYygxLDIpLCAtLT4KPCEtLSAgICAgICAgIGdyb3VwLmJ5ID0gJ0xpbmVhZ2UnLCBwdC5zaXplID0gLjEsIGNlbGxzLmhpZ2hsaWdodCA9IGxpc3QoRGFidHJhbV9pbmR1Y2VkdG9fQ2lzKSwgLS0+CjwhLS0gICAgICAgICBjb2xzLmhpZ2hsaWdodCA9ICdjeWFuJykgKyBnZ3RpdGxlKHBhc3RlKCdEYWJyYWZlbmliIGluZHVjZWQgcmVzaXN0YW5jZSB0byBDaXMgLSAjIGNlbGxzOicsIGxlbmd0aChEYWJ0cmFtX2luZHVjZWR0b19DaXMpKSkgLS0+Cgo8IS0tIERpbVBsb3QoZGFidHJhbSwgcmVkdWN0aW9uID0gJ3VtYXAnLCBkaW1zID0gYygxLDIpKSArIGdndGl0bGUoJ0dyb3VuZCBUcnV0aHMnKSAtLT4KCjwhLS0gRGFidHJhbV9pbmR1Y2VkdG9fQ2lzX21hcmtlcnMkZGlmZmV4cHJlc3NlZCA8LSAiTk8iIC0tPgo8IS0tICMgaWYgbG9nMkZvbGRjaGFuZ2UgPiAwLjYgYW5kIHB2YWx1ZSA8IDAuMDUsIHNldCBhcyAiVVAiICAtLT4KPCEtLSBEYWJ0cmFtX2luZHVjZWR0b19DaXNfbWFya2VycyRkaWZmZXhwcmVzc2VkW0RhYnRyYW1faW5kdWNlZHRvX0Npc19tYXJrZXJzJGF2Z19sb2cyRkMgPiAxICYgRGFidHJhbV9pbmR1Y2VkdG9fQ2lzX21hcmtlcnMkcF92YWwgPCAwLjA1XSA8LSAiVVAiIC0tPgo8IS0tICMgaWYgbG9nMkZvbGRjaGFuZ2UgPCAtMC42IGFuZCBwdmFsdWUgPCAwLjA1LCBzZXQgYXMgIkRPV04iIC0tPgo8IS0tIERhYnRyYW1faW5kdWNlZHRvX0Npc19tYXJrZXJzJGRpZmZleHByZXNzZWRbRGFidHJhbV9pbmR1Y2VkdG9fQ2lzX21hcmtlcnMkYXZnX2xvZzJGQyA8IC0xICYgRGFidHJhbV9pbmR1Y2VkdG9fQ2lzX21hcmtlcnMkcF92YWwgPCAwLjA1XSA8LSAiRE9XTiIgLS0+Cgo8IS0tIERhYnRyYW1faW5kdWNlZHRvX0Npc19tYXJrZXJzJGRlbGFiZWwgPC0gTkEgLS0+CjwhLS0gRGFidHJhbV9pbmR1Y2VkdG9fQ2lzX21hcmtlcnMkZGVsYWJlbFtEYWJ0cmFtX2luZHVjZWR0b19DaXNfbWFya2VycyRkaWZmZXhwcmVzc2VkICE9ICJOTyJdIDwtIHJvd25hbWVzKERhYnRyYW1faW5kdWNlZHRvX0Npc19tYXJrZXJzKVtEYWJ0cmFtX2luZHVjZWR0b19DaXNfbWFya2VycyRkaWZmZXhwcmVzc2VkICE9ICJOTyJdIC0tPgoKPCEtLSBnZ3Bsb3QoZGF0YT1EYWJ0cmFtX2luZHVjZWR0b19DaXNfbWFya2VycywgYWVzKHg9YXZnX2xvZzJGQywgeT0tbG9nMTAocF92YWwpLCBjb2w9ZGlmZmV4cHJlc3NlZCwgbGFiZWw9ZGVsYWJlbCkpICsgLS0+CjwhLS0gICBnZW9tX3BvaW50KCkgKyAgLS0+CjwhLS0gICB0aGVtZV9taW5pbWFsKCkgKyAtLT4KPCEtLSAgIGdlb21fdGV4dCgpICsgLS0+CjwhLS0gICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzPWMoImJsdWUiLCAiYmxhY2siLCAicmVkIikpICsgLS0+CjwhLS0gICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQ9YygtMSwgMSksIGNvbD0icmVkIikgKyAtLT4KPCEtLSAgIGdlb21faGxpbmUoeWludGVyY2VwdD0tbG9nMTAoMC4wNSksIGNvbD0icmVkIikgKyAtLT4KPCEtLSAgIGdndGl0bGUoJ3BfdmFsJykgLS0+Cgo8IS0tIERhYnRyYW1faW5kdWNlZHRvX0Npc19tYXJrZXJzJGRpZmZleHByZXNzZWQgPC0gIk5PIiAtLT4KPCEtLSAjIGlmIGxvZzJGb2xkY2hhbmdlID4gMC42IGFuZCBwdmFsdWUgPCAwLjA1LCBzZXQgYXMgIlVQIiAgLS0+CjwhLS0gRGFidHJhbV9pbmR1Y2VkdG9fQ2lzX21hcmtlcnMkZGlmZmV4cHJlc3NlZFtEYWJ0cmFtX2luZHVjZWR0b19DaXNfbWFya2VycyRhdmdfbG9nMkZDID4gMSAmIERhYnRyYW1faW5kdWNlZHRvX0Npc19tYXJrZXJzJHBfdmFsX2FkaiA8IDAuMDVdIDwtICJVUCIgLS0+CjwhLS0gIyBpZiBsb2cyRm9sZGNoYW5nZSA8IC0wLjYgYW5kIHB2YWx1ZSA8IDAuMDUsIHNldCBhcyAiRE9XTiIgLS0+CjwhLS0gRGFidHJhbV9pbmR1Y2VkdG9fQ2lzX21hcmtlcnMkZGlmZmV4cHJlc3NlZFtEYWJ0cmFtX2luZHVjZWR0b19DaXNfbWFya2VycyRhdmdfbG9nMkZDIDwgLTEgJiBEYWJ0cmFtX2luZHVjZWR0b19DaXNfbWFya2VycyRwX3ZhbF9hZGogPCAwLjA1XSA8LSAiRE9XTiIgLS0+Cgo8IS0tIERhYnRyYW1faW5kdWNlZHRvX0Npc19tYXJrZXJzJGRlbGFiZWwgPC0gTkEgLS0+CjwhLS0gRGFidHJhbV9pbmR1Y2VkdG9fQ2lzX21hcmtlcnMkZGVsYWJlbFtEYWJ0cmFtX2luZHVjZWR0b19DaXNfbWFya2VycyRkaWZmZXhwcmVzc2VkICE9ICJOTyJdIDwtIHJvd25hbWVzKERhYnRyYW1faW5kdWNlZHRvX0Npc19tYXJrZXJzKVtEYWJ0cmFtX2luZHVjZWR0b19DaXNfbWFya2VycyRkaWZmZXhwcmVzc2VkICE9ICJOTyJdIC0tPgoKCjwhLS0gZ2dwbG90KGRhdGE9RGFidHJhbV9pbmR1Y2VkdG9fQ2lzX21hcmtlcnMsIGFlcyh4PWF2Z19sb2cyRkMsIHk9LWxvZzEwKHBfdmFsX2FkaiksIGNvbD1kaWZmZXhwcmVzc2VkLCBsYWJlbD1kZWxhYmVsKSkgKyAtLT4KPCEtLSAgIGdlb21fcG9pbnQoKSArICAtLT4KPCEtLSAgIHRoZW1lX21pbmltYWwoKSArIC0tPgo8IS0tICAgZ2VvbV90ZXh0KCkgKyAtLT4KPCEtLSAgIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXM9YygiYmx1ZSIsICJibGFjayIsICJyZWQiKSkgKyAtLT4KPCEtLSAgIGdlb21fdmxpbmUoeGludGVyY2VwdD1jKC0xLCAxKSwgY29sPSJyZWQiKSArIC0tPgo8IS0tICAgZ2VvbV9obGluZSh5aW50ZXJjZXB0PS1sb2cxMCgwLjA1KSwgY29sPSJyZWQiKSArICAtLT4KPCEtLSAgIGdndGl0bGUoJ3BfdmFsX2FkaicpIC0tPgoKCjwhLS0gZm9yIChpIGluIHJvd25hbWVzKERhYnRyYW1faW5kdWNlZHRvX0Npc19tYXJrZXJzKVtvcmRlcihEYWJ0cmFtX2luZHVjZWR0b19DaXNfbWFya2VycyRhdmdfbG9nMkZDLCBkZWNyZWFzaW5nID0gVCldWzE6MjBdKXsgLS0+CjwhLS0gICBwMSA8LSBGZWF0dXJlUGxvdChkYWJ0cmFtLCBmZWF0dXJlcyA9IGkpICYgc2NhbGVfY29sb3VyX2dyYWRpZW50bihjb2xvcnMgPSByZXYoYnJld2VyLnBhbChuID0gMTEsIG5hbWUgPSAnUmRCdScpKSkgLS0+CjwhLS0gICBwMiA8LSBGZWF0dXJlUGxvdChkYWJ0cmFtX2ZpcnN0LCBmZWF0dXJlcyA9IGkpICYgc2NhbGVfY29sb3VyX2dyYWRpZW50bihjb2xvcnMgPSByZXYoYnJld2VyLnBhbChuID0gMTEsIG5hbWUgPSAnUmRCdScpKSkgLS0+CjwhLS0gICBwcmludChwbG90X2dyaWQocDEscDIpKSAtLT4KPCEtLSB9IC0tPgoKPCEtLSBmb3IgKGkgaW4gcm93bmFtZXMoRGFidHJhbV9pbmR1Y2VkdG9fQ2lzX21hcmtlcnMpW29yZGVyKERhYnRyYW1faW5kdWNlZHRvX0Npc19tYXJrZXJzJGF2Z19sb2cyRkMsIGRlY3JlYXNpbmcgPSBUKV1bMToyMF0peyAtLT4KPCEtLSAgIHByaW50KFJpZGdlUGxvdChkYWJ0cmFtLCBmZWF0dXJlcyA9IGksIGlkZW50cyA9IGMoJ0luZHVjZWQgUmVzaXN0YW50JywnU2Vuc2l0aXZlJyksIGNvbHMgPSBjKCdncmV5JywgJ2N5YW4nKSkpIC0tPgo8IS0tIH0gLS0+CjwhLS0gZGV2Lm9mZigpIC0tPgoKPCEtLSBgYGAgLS0+Cgo8IS0tICMgQ29DbDIgaW5kdWNlZCB0byBEYWJ0cmFtIC0tPgo8IS0tIGBgYHtyfSAtLT4KPCEtLSBDb0NsMl9ub3RfaW5kdWNlZHRvX0RhYnRyYW0gPC0gbmFtZXMoY29jbDIkb3JpZy5pZGVudFtjb2NsMiRMaW5lYWdlICVuaW4lIGMoZmluYWxfaW5kdWNlZF9yZXNpc3RhbnRfbGlucyRDb0NsMl9JbmR1Y2VkdG9fRGFiVHJhbSwiTm8gQmFyY29kZSIsIlN0aWxsIG11bHRpcGxlIikgXSkgIC0tPgo8IS0tIENvQ2wyX2luZHVjZWR0b19EYWJ0cmFtIDwtIG5hbWVzKGNvY2wyJG9yaWcuaWRlbnRbY29jbDIkTGluZWFnZSAlaW4lIGZpbmFsX2luZHVjZWRfcmVzaXN0YW50X2xpbnMkQ29DbDJfSW5kdWNlZHRvX0RhYlRyYW1dKSAtLT4KCjwhLS0gIyBHZXQgbWFya2VycyBvZiBkYWJyYWZlbmliIGluZHVjZWQgdG8gY29jbDIgcmVzaXN0YW5jZSAtLT4KPCEtLSBDb0NsMl9pbmR1Y2VkdG9fRGFidHJhbV9tYXJrZXJzIDwtIEZpbmRNYXJrZXJzKGNvY2wyLCBpZGVudC4xID0gQ29DbDJfbm90X2luZHVjZWR0b19EYWJ0cmFtLCBpZGVudC4yID0gQ29DbDJfaW5kdWNlZHRvX0RhYnRyYW0sIGxvZ2ZjLnRocmVzaG9sZCA9IDAuMjUpIC0tPgoKPCEtLSAjIG1ha2UgbWV0YWRhdGEgb2JqZWN0IGZvciBkYWJyYWZlbmliIGluZHVjZWQgdG8gY29jbDIgcmVzaXN0YW5jZSAtLT4KPCEtLSBjb2NsMl9pbmR1Y2VkdG9fZGFidHJhbV9mb3J2bG4gPC0gcmVwKDAsIGxlbmd0aChuYW1lcyhjb2NsMiRMaW5lYWdlKSkpIC0tPgo8IS0tIGNvY2wyX2luZHVjZWR0b19kYWJ0cmFtX2ZvcnZsblt3aGljaChjb2NsMiRMaW5lYWdlICVuaW4lIGMoZmluYWxfaW5kdWNlZF9yZXNpc3RhbnRfbGlucyRDb0NsMl9JbmR1Y2VkdG9fRGFiVHJhbSwiTm8gQmFyY29kZSIsIlN0aWxsIG11bHRpcGxlIikpXSA8LSAnU2Vuc2l0aXZlJyAtLT4KPCEtLSBjb2NsMl9pbmR1Y2VkdG9fZGFidHJhbV9mb3J2bG5bd2hpY2goY29jbDIkTGluZWFnZSAlaW4lIGMoZmluYWxfaW5kdWNlZF9yZXNpc3RhbnRfbGlucyRDb0NsMl9JbmR1Y2VkdG9fRGFiVHJhbSkpXSA8LSAnSW5kdWNlZCBSZXNpc3RhbnQnIC0tPgo8IS0tIGNvY2wyX2luZHVjZWR0b19kYWJ0cmFtX2ZvcnZsblt3aGljaChjb2NsMiRMaW5lYWdlICVpbiUgYygiTm8gQmFyY29kZSIsIlN0aWxsIG11bHRpcGxlIikpXSA8LSAnTm8gQmFyY29kZScgLS0+CjwhLS0gY29jbDIkQ29DbDJfaW5kdWNlZHRvX0RhYnRyYW0gPC0gY29jbDJfaW5kdWNlZHRvX2RhYnRyYW1fZm9ydmxuIC0tPgo8IS0tIElkZW50cyhjb2NsMikgPC0gY29jbDIkQ29DbDJfaW5kdWNlZHRvX0RhYnRyYW0gLS0+Cgo8IS0tIGBgYCAtLT4KCjwhLS0gIyBQbG90IHRoZSBEYWIgcmVzaXN0YW50IGNlbGxzIG9uIG5haXZlIHVtYXAgLS0+CjwhLS0gYGBge3IgaW5jbHVkZSA9IEZBTFNFfSAtLT4KPCEtLSBwZGYoJzIwMjJfMDFfMTRfYW5hbHlzaXNfc2NyaXB0cy8yMDIyXzA1XzI3X2FuYWx5c2lzL0luZHVjZWRfUmVzaXN0YW5jZS9jb2NsMl9pbmR1Y2VkdG9fZGFidHJhbV9NYXJrZXJzLnBkZicpIC0tPgo8IS0tIERpbVBsb3QoY29jbDIsIHJlZHVjdGlvbiA9ICJ1bWFwIiwgZGltcyA9IGMoMSwyKSwgLS0+CjwhLS0gICAgICAgICBncm91cC5ieSA9ICdMaW5lYWdlJywgcHQuc2l6ZSA9IC4xLCBjZWxscy5oaWdobGlnaHQgPSBsaXN0KENvQ2wyX2luZHVjZWR0b19EYWJ0cmFtKSwgLS0+CjwhLS0gICAgICAgICBjb2xzLmhpZ2hsaWdodCA9ICdjeWFuJykgKyBnZ3RpdGxlKHBhc3RlKCdDb0NsMiBpbmR1Y2VkIHJlc2lzdGFuY2UgdG8gZGFidHJhbSAtICMgY2VsbHM6JywgbGVuZ3RoKENvQ2wyX2luZHVjZWR0b19EYWJ0cmFtKSkpIC0tPgoKPCEtLSBEaW1QbG90KGNvY2wyLCByZWR1Y3Rpb24gPSAndW1hcCcsIGRpbXMgPSBjKDEsMikpICsgZ2d0aXRsZSgnR3JvdW5kIFRydXRocycpIC0tPgoKPCEtLSBDb0NsMl9pbmR1Y2VkdG9fRGFidHJhbV9tYXJrZXJzJGRpZmZleHByZXNzZWQgPC0gIk5PIiAtLT4KPCEtLSAjIGlmIGxvZzJGb2xkY2hhbmdlID4gMC42IGFuZCBwdmFsdWUgPCAwLjA1LCBzZXQgYXMgIlVQIiAgLS0+CjwhLS0gQ29DbDJfaW5kdWNlZHRvX0RhYnRyYW1fbWFya2VycyRkaWZmZXhwcmVzc2VkW0NvQ2wyX2luZHVjZWR0b19EYWJ0cmFtX21hcmtlcnMkYXZnX2xvZzJGQyA+IDEgJiBDb0NsMl9pbmR1Y2VkdG9fRGFidHJhbV9tYXJrZXJzJHBfdmFsIDwgMC4wNV0gPC0gIlVQIiAtLT4KPCEtLSAjIGlmIGxvZzJGb2xkY2hhbmdlIDwgLTAuNiBhbmQgcHZhbHVlIDwgMC4wNSwgc2V0IGFzICJET1dOIiAtLT4KPCEtLSBDb0NsMl9pbmR1Y2VkdG9fRGFidHJhbV9tYXJrZXJzJGRpZmZleHByZXNzZWRbQ29DbDJfaW5kdWNlZHRvX0RhYnRyYW1fbWFya2VycyRhdmdfbG9nMkZDIDwgLTEgJiBDb0NsMl9pbmR1Y2VkdG9fRGFidHJhbV9tYXJrZXJzJHBfdmFsIDwgMC4wNV0gPC0gIkRPV04iIC0tPgoKPCEtLSBDb0NsMl9pbmR1Y2VkdG9fRGFidHJhbV9tYXJrZXJzJGRlbGFiZWwgPC0gTkEgLS0+CjwhLS0gQ29DbDJfaW5kdWNlZHRvX0RhYnRyYW1fbWFya2VycyRkZWxhYmVsW0NvQ2wyX2luZHVjZWR0b19EYWJ0cmFtX21hcmtlcnMkZGlmZmV4cHJlc3NlZCAhPSAiTk8iXSA8LSByb3duYW1lcyhDb0NsMl9pbmR1Y2VkdG9fRGFidHJhbV9tYXJrZXJzKVtDb0NsMl9pbmR1Y2VkdG9fRGFidHJhbV9tYXJrZXJzJGRpZmZleHByZXNzZWQgIT0gIk5PIl0gLS0+Cgo8IS0tIGdncGxvdChkYXRhPUNvQ2wyX2luZHVjZWR0b19EYWJ0cmFtX21hcmtlcnMsIGFlcyh4PWF2Z19sb2cyRkMsIHk9LWxvZzEwKHBfdmFsKSwgY29sPWRpZmZleHByZXNzZWQsIGxhYmVsPWRlbGFiZWwpKSArIC0tPgo8IS0tICAgZ2VvbV9wb2ludCgpICsgIC0tPgo8IS0tICAgdGhlbWVfbWluaW1hbCgpICsgLS0+CjwhLS0gICBnZW9tX3RleHQoKSArIC0tPgo8IS0tICAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcz1jKCJibHVlIiwgImJsYWNrIiwgInJlZCIpKSArIC0tPgo8IS0tICAgZ2VvbV92bGluZSh4aW50ZXJjZXB0PWMoLTEsIDEpLCBjb2w9InJlZCIpICsgLS0+CjwhLS0gICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQ9LWxvZzEwKDAuMDUpLCBjb2w9InJlZCIpICsgLS0+CjwhLS0gICBnZ3RpdGxlKCdwX3ZhbCcpIC0tPgoKPCEtLSBDb0NsMl9pbmR1Y2VkdG9fRGFidHJhbV9tYXJrZXJzJGRpZmZleHByZXNzZWQgPC0gIk5PIiAtLT4KPCEtLSAjIGlmIGxvZzJGb2xkY2hhbmdlID4gMC42IGFuZCBwdmFsdWUgPCAwLjA1LCBzZXQgYXMgIlVQIiAgLS0+CjwhLS0gQ29DbDJfaW5kdWNlZHRvX0RhYnRyYW1fbWFya2VycyRkaWZmZXhwcmVzc2VkW0NvQ2wyX2luZHVjZWR0b19EYWJ0cmFtX21hcmtlcnMkYXZnX2xvZzJGQyA+IDEgJiBDb0NsMl9pbmR1Y2VkdG9fRGFidHJhbV9tYXJrZXJzJHBfdmFsX2FkaiA8IDAuMDVdIDwtICJVUCIgLS0+CjwhLS0gIyBpZiBsb2cyRm9sZGNoYW5nZSA8IC0wLjYgYW5kIHB2YWx1ZSA8IDAuMDUsIHNldCBhcyAiRE9XTiIgLS0+CjwhLS0gQ29DbDJfaW5kdWNlZHRvX0RhYnRyYW1fbWFya2VycyRkaWZmZXhwcmVzc2VkW0NvQ2wyX2luZHVjZWR0b19EYWJ0cmFtX21hcmtlcnMkYXZnX2xvZzJGQyA8IC0xICYgQ29DbDJfaW5kdWNlZHRvX0RhYnRyYW1fbWFya2VycyRwX3ZhbF9hZGogPCAwLjA1XSA8LSAiRE9XTiIgLS0+Cgo8IS0tIENvQ2wyX2luZHVjZWR0b19EYWJ0cmFtX21hcmtlcnMkZGVsYWJlbCA8LSBOQSAtLT4KPCEtLSBDb0NsMl9pbmR1Y2VkdG9fRGFidHJhbV9tYXJrZXJzJGRlbGFiZWxbQ29DbDJfaW5kdWNlZHRvX0RhYnRyYW1fbWFya2VycyRkaWZmZXhwcmVzc2VkICE9ICJOTyJdIDwtIHJvd25hbWVzKENvQ2wyX2luZHVjZWR0b19EYWJ0cmFtX21hcmtlcnMpW0NvQ2wyX2luZHVjZWR0b19EYWJ0cmFtX21hcmtlcnMkZGlmZmV4cHJlc3NlZCAhPSAiTk8iXSAtLT4KCgo8IS0tIGdncGxvdChkYXRhPUNvQ2wyX2luZHVjZWR0b19EYWJ0cmFtX21hcmtlcnMsIGFlcyh4PWF2Z19sb2cyRkMsIHk9LWxvZzEwKHBfdmFsX2FkaiksIGNvbD1kaWZmZXhwcmVzc2VkLCBsYWJlbD1kZWxhYmVsKSkgKyAtLT4KPCEtLSAgIGdlb21fcG9pbnQoKSArICAtLT4KPCEtLSAgIHRoZW1lX21pbmltYWwoKSArIC0tPgo8IS0tICAgZ2VvbV90ZXh0KCkgKyAtLT4KPCEtLSAgIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXM9YygiYmx1ZSIsICJibGFjayIsICJyZWQiKSkgKyAtLT4KPCEtLSAgIGdlb21fdmxpbmUoeGludGVyY2VwdD1jKC0xLCAxKSwgY29sPSJyZWQiKSArIC0tPgo8IS0tICAgZ2VvbV9obGluZSh5aW50ZXJjZXB0PS1sb2cxMCgwLjA1KSwgY29sPSJyZWQiKSArICAtLT4KPCEtLSAgIGdndGl0bGUoJ3BfdmFsX2FkaicpIC0tPgoKCjwhLS0gZm9yIChpIGluIHJvd25hbWVzKENvQ2wyX2luZHVjZWR0b19EYWJ0cmFtX21hcmtlcnMpW29yZGVyKENvQ2wyX2luZHVjZWR0b19EYWJ0cmFtX21hcmtlcnMkYXZnX2xvZzJGQywgZGVjcmVhc2luZyA9IFQpXVsxOjIwXSl7IC0tPgo8IS0tICAgcDEgPC0gRmVhdHVyZVBsb3QoY29jbDIsIGZlYXR1cmVzID0gaSkgJiBzY2FsZV9jb2xvdXJfZ3JhZGllbnRuKGNvbG9ycyA9IHJldihicmV3ZXIucGFsKG4gPSAxMSwgbmFtZSA9ICdSZEJ1JykpKSAtLT4KPCEtLSAgIHAyIDwtIEZlYXR1cmVQbG90KGNvY2wyX2ZpcnN0LCBmZWF0dXJlcyA9IGkpICYgc2NhbGVfY29sb3VyX2dyYWRpZW50bihjb2xvcnMgPSByZXYoYnJld2VyLnBhbChuID0gMTEsIG5hbWUgPSAnUmRCdScpKSkgLS0+CjwhLS0gICBwcmludChwbG90X2dyaWQocDEscDIpKSAtLT4KPCEtLSB9IC0tPgoKPCEtLSBmb3IgKGkgaW4gcm93bmFtZXMoQ29DbDJfaW5kdWNlZHRvX0RhYnRyYW1fbWFya2Vycylbb3JkZXIoQ29DbDJfaW5kdWNlZHRvX0RhYnRyYW1fbWFya2VycyRhdmdfbG9nMkZDLCBkZWNyZWFzaW5nID0gVCldWzE6MjBdKXsgLS0+CjwhLS0gICBwcmludChSaWRnZVBsb3QoY29jbDIsIGZlYXR1cmVzID0gaSwgaWRlbnRzID0gYygnSW5kdWNlZCBSZXNpc3RhbnQnLCdTZW5zaXRpdmUnKSwgY29scyA9IGMoJ2dyZXknLCAnY3lhbicpKSkgLS0+CjwhLS0gfSAtLT4KPCEtLSBkZXYub2ZmKCkgLS0+CjwhLS0gYGBgIC0tPgoKCjwhLS0gIyBDb0NsMiBpbmR1Y2VkIHRvIGNpcyAtLT4KPCEtLSBgYGB7cn0gLS0+CjwhLS0gQ29DbDJfbm90X2luZHVjZWR0b19DaXMgPC0gbmFtZXMoY29jbDIkb3JpZy5pZGVudFtjb2NsMiRMaW5lYWdlICVuaW4lIGMoZmluYWxfaW5kdWNlZF9yZXNpc3RhbnRfbGlucyRDb0NsMl9JbmR1Y2VkdG9fQ2lzLCJObyBCYXJjb2RlIiwiU3RpbGwgbXVsdGlwbGUiKSBdKSAgLS0+CjwhLS0gQ29DbDJfaW5kdWNlZHRvX0NpcyA8LSBuYW1lcyhjb2NsMiRvcmlnLmlkZW50W2NvY2wyJExpbmVhZ2UgJWluJSBmaW5hbF9pbmR1Y2VkX3Jlc2lzdGFudF9saW5zJENvQ2wyX0luZHVjZWR0b19DaXNdKSAtLT4KCjwhLS0gIyBHZXQgbWFya2VycyBvZiBkYWJyYWZlbmliIGluZHVjZWQgdG8gY29jbDIgcmVzaXN0YW5jZSAtLT4KPCEtLSBDb0NsMl9pbmR1Y2VkdG9fQ2lzX21hcmtlcnMgPC0gRmluZE1hcmtlcnMoY29jbDIsIGlkZW50LjEgPSBDb0NsMl9ub3RfaW5kdWNlZHRvX0NpcywgaWRlbnQuMiA9IENvQ2wyX2luZHVjZWR0b19DaXMsIGxvZ2ZjLnRocmVzaG9sZCA9IDAuMjUpIC0tPgoKPCEtLSAjIG1ha2UgbWV0YWRhdGEgb2JqZWN0IGZvciBkYWJyYWZlbmliIGluZHVjZWQgdG8gY29jbDIgcmVzaXN0YW5jZSAtLT4KPCEtLSBjb2NsMl9pbmR1Y2VkdG9fY2lzX2ZvcnZsbiA8LSByZXAoMCwgbGVuZ3RoKG5hbWVzKGNvY2wyJExpbmVhZ2UpKSkgLS0+CjwhLS0gY29jbDJfaW5kdWNlZHRvX2Npc19mb3J2bG5bd2hpY2goY29jbDIkTGluZWFnZSAlbmluJSBjKGZpbmFsX2luZHVjZWRfcmVzaXN0YW50X2xpbnMkQ29DbDJfSW5kdWNlZHRvX0NpcywiTm8gQmFyY29kZSIsIlN0aWxsIG11bHRpcGxlIikpXSA8LSAnU2Vuc2l0aXZlJyAtLT4KPCEtLSBjb2NsMl9pbmR1Y2VkdG9fY2lzX2ZvcnZsblt3aGljaChjb2NsMiRMaW5lYWdlICVpbiUgYyhmaW5hbF9pbmR1Y2VkX3Jlc2lzdGFudF9saW5zJENvQ2wyX0luZHVjZWR0b19DaXMpKV0gPC0gJ0luZHVjZWQgUmVzaXN0YW50JyAtLT4KPCEtLSBjb2NsMl9pbmR1Y2VkdG9fY2lzX2ZvcnZsblt3aGljaChjb2NsMiRMaW5lYWdlICVpbiUgYygiTm8gQmFyY29kZSIsIlN0aWxsIG11bHRpcGxlIikpXSA8LSAnTm8gQmFyY29kZScgLS0+CjwhLS0gY29jbDIkQ29DbDJfaW5kdWNlZHRvX2NpcyA8LSBjb2NsMl9pbmR1Y2VkdG9fY2lzX2ZvcnZsbiAtLT4KPCEtLSBJZGVudHMoY29jbDIpIDwtIGNvY2wyJENvQ2wyX2luZHVjZWR0b19jaXMgLS0+Cgo8IS0tIGBgYCAtLT4KCjwhLS0gIyBQbG90IHRoZSBEYWIgcmVzaXN0YW50IGNlbGxzIG9uIG5haXZlIHVtYXAgLS0+CjwhLS0gYGBge3IgaW5jbHVkZSA9IEZBTFNFfSAtLT4KPCEtLSBwZGYoJzIwMjJfMDFfMTRfYW5hbHlzaXNfc2NyaXB0cy8yMDIyXzA1XzI3X2FuYWx5c2lzL0luZHVjZWRfUmVzaXN0YW5jZS9jb2NsMl9pbmR1Y2VkdG9fY2lzX01hcmtlcnMucGRmJykgLS0+CjwhLS0gRGltUGxvdChjb2NsMiwgcmVkdWN0aW9uID0gInVtYXAiLCBkaW1zID0gYygxLDIpLCAtLT4KPCEtLSAgICAgICAgIGdyb3VwLmJ5ID0gJ0xpbmVhZ2UnLCBwdC5zaXplID0gLjEsIGNlbGxzLmhpZ2hsaWdodCA9IGxpc3QoQ29DbDJfaW5kdWNlZHRvX0NpcyksIC0tPgo8IS0tICAgICAgICAgY29scy5oaWdobGlnaHQgPSAnY3lhbicpICsgZ2d0aXRsZShwYXN0ZSgnQ29DbDIgaW5kdWNlZCByZXNpc3RhbmNlIHRvIGNpcyAtICMgY2VsbHM6JywgbGVuZ3RoKENvQ2wyX2luZHVjZWR0b19DaXMpKSkgLS0+Cgo8IS0tIERpbVBsb3QoY29jbDIsIHJlZHVjdGlvbiA9ICd1bWFwJywgZGltcyA9IGMoMSwyKSkgKyBnZ3RpdGxlKCdHcm91bmQgVHJ1dGhzJykgLS0+Cgo8IS0tIENvQ2wyX2luZHVjZWR0b19DaXNfbWFya2VycyRkaWZmZXhwcmVzc2VkIDwtICJOTyIgLS0+CjwhLS0gIyBpZiBsb2cyRm9sZGNoYW5nZSA+IDAuNiBhbmQgcHZhbHVlIDwgMC4wNSwgc2V0IGFzICJVUCIgIC0tPgo8IS0tIENvQ2wyX2luZHVjZWR0b19DaXNfbWFya2VycyRkaWZmZXhwcmVzc2VkW0NvQ2wyX2luZHVjZWR0b19DaXNfbWFya2VycyRhdmdfbG9nMkZDID4gMSAmIENvQ2wyX2luZHVjZWR0b19DaXNfbWFya2VycyRwX3ZhbCA8IDAuMDVdIDwtICJVUCIgLS0+CjwhLS0gIyBpZiBsb2cyRm9sZGNoYW5nZSA8IC0wLjYgYW5kIHB2YWx1ZSA8IDAuMDUsIHNldCBhcyAiRE9XTiIgLS0+CjwhLS0gQ29DbDJfaW5kdWNlZHRvX0Npc19tYXJrZXJzJGRpZmZleHByZXNzZWRbQ29DbDJfaW5kdWNlZHRvX0Npc19tYXJrZXJzJGF2Z19sb2cyRkMgPCAtMSAmIENvQ2wyX2luZHVjZWR0b19DaXNfbWFya2VycyRwX3ZhbCA8IDAuMDVdIDwtICJET1dOIiAtLT4KCjwhLS0gQ29DbDJfaW5kdWNlZHRvX0Npc19tYXJrZXJzJGRlbGFiZWwgPC0gTkEgLS0+CjwhLS0gQ29DbDJfaW5kdWNlZHRvX0Npc19tYXJrZXJzJGRlbGFiZWxbQ29DbDJfaW5kdWNlZHRvX0Npc19tYXJrZXJzJGRpZmZleHByZXNzZWQgIT0gIk5PIl0gPC0gcm93bmFtZXMoQ29DbDJfaW5kdWNlZHRvX0Npc19tYXJrZXJzKVtDb0NsMl9pbmR1Y2VkdG9fQ2lzX21hcmtlcnMkZGlmZmV4cHJlc3NlZCAhPSAiTk8iXSAtLT4KCjwhLS0gZ2dwbG90KGRhdGE9Q29DbDJfaW5kdWNlZHRvX0Npc19tYXJrZXJzLCBhZXMoeD1hdmdfbG9nMkZDLCB5PS1sb2cxMChwX3ZhbCksIGNvbD1kaWZmZXhwcmVzc2VkLCBsYWJlbD1kZWxhYmVsKSkgKyAtLT4KPCEtLSAgIGdlb21fcG9pbnQoKSArICAtLT4KPCEtLSAgIHRoZW1lX21pbmltYWwoKSArIC0tPgo8IS0tICAgZ2VvbV90ZXh0KCkgKyAtLT4KPCEtLSAgIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXM9YygiYmx1ZSIsICJibGFjayIsICJyZWQiKSkgKyAtLT4KPCEtLSAgIGdlb21fdmxpbmUoeGludGVyY2VwdD1jKC0xLCAxKSwgY29sPSJyZWQiKSArIC0tPgo8IS0tICAgZ2VvbV9obGluZSh5aW50ZXJjZXB0PS1sb2cxMCgwLjA1KSwgY29sPSJyZWQiKSArIC0tPgo8IS0tICAgZ2d0aXRsZSgncF92YWwnKSAtLT4KCjwhLS0gQ29DbDJfaW5kdWNlZHRvX0Npc19tYXJrZXJzJGRpZmZleHByZXNzZWQgPC0gIk5PIiAtLT4KPCEtLSAjIGlmIGxvZzJGb2xkY2hhbmdlID4gMC42IGFuZCBwdmFsdWUgPCAwLjA1LCBzZXQgYXMgIlVQIiAgLS0+CjwhLS0gQ29DbDJfaW5kdWNlZHRvX0Npc19tYXJrZXJzJGRpZmZleHByZXNzZWRbQ29DbDJfaW5kdWNlZHRvX0Npc19tYXJrZXJzJGF2Z19sb2cyRkMgPiAxICYgQ29DbDJfaW5kdWNlZHRvX0Npc19tYXJrZXJzJHBfdmFsX2FkaiA8IDAuMDVdIDwtICJVUCIgLS0+CjwhLS0gIyBpZiBsb2cyRm9sZGNoYW5nZSA8IC0wLjYgYW5kIHB2YWx1ZSA8IDAuMDUsIHNldCBhcyAiRE9XTiIgLS0+CjwhLS0gQ29DbDJfaW5kdWNlZHRvX0Npc19tYXJrZXJzJGRpZmZleHByZXNzZWRbQ29DbDJfaW5kdWNlZHRvX0Npc19tYXJrZXJzJGF2Z19sb2cyRkMgPCAtMSAmIENvQ2wyX2luZHVjZWR0b19DaXNfbWFya2VycyRwX3ZhbF9hZGogPCAwLjA1XSA8LSAiRE9XTiIgLS0+Cgo8IS0tIENvQ2wyX2luZHVjZWR0b19DaXNfbWFya2VycyRkZWxhYmVsIDwtIE5BIC0tPgo8IS0tIENvQ2wyX2luZHVjZWR0b19DaXNfbWFya2VycyRkZWxhYmVsW0NvQ2wyX2luZHVjZWR0b19DaXNfbWFya2VycyRkaWZmZXhwcmVzc2VkICE9ICJOTyJdIDwtIHJvd25hbWVzKENvQ2wyX2luZHVjZWR0b19DaXNfbWFya2VycylbQ29DbDJfaW5kdWNlZHRvX0Npc19tYXJrZXJzJGRpZmZleHByZXNzZWQgIT0gIk5PIl0gLS0+CgoKPCEtLSBnZ3Bsb3QoZGF0YT1Db0NsMl9pbmR1Y2VkdG9fQ2lzX21hcmtlcnMsIGFlcyh4PWF2Z19sb2cyRkMsIHk9LWxvZzEwKHBfdmFsX2FkaiksIGNvbD1kaWZmZXhwcmVzc2VkLCBsYWJlbD1kZWxhYmVsKSkgKyAtLT4KPCEtLSAgIGdlb21fcG9pbnQoKSArICAtLT4KPCEtLSAgIHRoZW1lX21pbmltYWwoKSArIC0tPgo8IS0tICAgZ2VvbV90ZXh0KCkgKyAtLT4KPCEtLSAgIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXM9YygiYmx1ZSIsICJibGFjayIsICJyZWQiKSkgKyAtLT4KPCEtLSAgIGdlb21fdmxpbmUoeGludGVyY2VwdD1jKC0xLCAxKSwgY29sPSJyZWQiKSArIC0tPgo8IS0tICAgZ2VvbV9obGluZSh5aW50ZXJjZXB0PS1sb2cxMCgwLjA1KSwgY29sPSJyZWQiKSArICAtLT4KPCEtLSAgIGdndGl0bGUoJ3BfdmFsX2FkaicpIC0tPgoKCjwhLS0gZm9yIChpIGluIHJvd25hbWVzKENvQ2wyX2luZHVjZWR0b19DaXNfbWFya2Vycylbb3JkZXIoQ29DbDJfaW5kdWNlZHRvX0Npc19tYXJrZXJzJGF2Z19sb2cyRkMsIGRlY3JlYXNpbmcgPSBUKV1bMToyMF0peyAtLT4KPCEtLSAgIHAxIDwtIEZlYXR1cmVQbG90KGNvY2wyLCBmZWF0dXJlcyA9IGkpICYgc2NhbGVfY29sb3VyX2dyYWRpZW50bihjb2xvcnMgPSByZXYoYnJld2VyLnBhbChuID0gMTEsIG5hbWUgPSAnUmRCdScpKSkgLS0+CjwhLS0gICBwMiA8LSBGZWF0dXJlUGxvdChjb2NsMl9maXJzdCwgZmVhdHVyZXMgPSBpKSAmIHNjYWxlX2NvbG91cl9ncmFkaWVudG4oY29sb3JzID0gcmV2KGJyZXdlci5wYWwobiA9IDExLCBuYW1lID0gJ1JkQnUnKSkpIC0tPgo8IS0tICAgcHJpbnQocGxvdF9ncmlkKHAxLHAyKSkgLS0+CjwhLS0gfSAtLT4KCjwhLS0gZm9yIChpIGluIHJvd25hbWVzKENvQ2wyX2luZHVjZWR0b19DaXNfbWFya2Vycylbb3JkZXIoQ29DbDJfaW5kdWNlZHRvX0Npc19tYXJrZXJzJGF2Z19sb2cyRkMsIGRlY3JlYXNpbmcgPSBUKV1bMToyMF0peyAtLT4KPCEtLSAgIHByaW50KFJpZGdlUGxvdChjb2NsMiwgZmVhdHVyZXMgPSBpLCBpZGVudHMgPSBjKCdJbmR1Y2VkIFJlc2lzdGFudCcsJ1NlbnNpdGl2ZScpLCBjb2xzID0gYygnZ3JleScsICdjeWFuJykpKSAtLT4KPCEtLSB9IC0tPgo8IS0tIGRldi5vZmYoKSAtLT4KPCEtLSBgYGAgLS0+Cgo8IS0tICMgQ2lzIGluZHVjZWQgdG8gZGFidHJhbSAtLT4KPCEtLSBgYGB7cn0gLS0+CjwhLS0gQ2lzX25vdF9pbmR1Y2VkdG9fRGFidHJhbSA8LSBuYW1lcyhjaXMkb3JpZy5pZGVudFtjaXMkTGluZWFnZSAlbmluJSBjKGZpbmFsX2luZHVjZWRfcmVzaXN0YW50X2xpbnMkQ2lzX0luZHVjZWR0b19EYWJUcmFtLCJObyBCYXJjb2RlIiwiU3RpbGwgbXVsdGlwbGUiKSBdKSAgLS0+CjwhLS0gQ2lzX2luZHVjZWR0b19EYWJ0cmFtIDwtIG5hbWVzKGNpcyRvcmlnLmlkZW50W2NpcyRMaW5lYWdlICVpbiUgZmluYWxfaW5kdWNlZF9yZXNpc3RhbnRfbGlucyRDaXNfSW5kdWNlZHRvX0RhYlRyYW1dKSAtLT4KCjwhLS0gIyBHZXQgbWFya2VycyBvZiBkYWJyYWZlbmliIGluZHVjZWQgdG8gY29jbDIgcmVzaXN0YW5jZSAtLT4KPCEtLSBDaXNfaW5kdWNlZHRvX0RhYnRyYW1fbWFya2VycyA8LSBGaW5kTWFya2VycyhjaXMsIGlkZW50LjEgPSBDaXNfbm90X2luZHVjZWR0b19EYWJ0cmFtLCBpZGVudC4yID0gQ2lzX2luZHVjZWR0b19EYWJ0cmFtLCBsb2dmYy50aHJlc2hvbGQgPSAwLjI1KSAtLT4KCjwhLS0gIyBtYWtlIG1ldGFkYXRhIG9iamVjdCBmb3IgZGFicmFmZW5pYiBpbmR1Y2VkIHRvIGNvY2wyIHJlc2lzdGFuY2UgLS0+CjwhLS0gY2lzX2luZHVjZWR0b19kYWJ0cmFtX2ZvcnZsbiA8LSByZXAoMCwgbGVuZ3RoKG5hbWVzKGNpcyRMaW5lYWdlKSkpIC0tPgo8IS0tIGNpc19pbmR1Y2VkdG9fZGFidHJhbV9mb3J2bG5bd2hpY2goY2lzJExpbmVhZ2UgJW5pbiUgYyhmaW5hbF9pbmR1Y2VkX3Jlc2lzdGFudF9saW5zJENpc19JbmR1Y2VkdG9fRGFiVHJhbSwiTm8gQmFyY29kZSIsIlN0aWxsIG11bHRpcGxlIikpXSA8LSAnU2Vuc2l0aXZlJyAtLT4KPCEtLSBjaXNfaW5kdWNlZHRvX2RhYnRyYW1fZm9ydmxuW3doaWNoKGNpcyRMaW5lYWdlICVpbiUgYyhmaW5hbF9pbmR1Y2VkX3Jlc2lzdGFudF9saW5zJENpc19JbmR1Y2VkdG9fRGFiVHJhbSkpXSA8LSAnSW5kdWNlZCBSZXNpc3RhbnQnIC0tPgo8IS0tIGNpc19pbmR1Y2VkdG9fZGFidHJhbV9mb3J2bG5bd2hpY2goY2lzJExpbmVhZ2UgJWluJSBjKCJObyBCYXJjb2RlIiwiU3RpbGwgbXVsdGlwbGUiKSldIDwtICdObyBCYXJjb2RlJyAtLT4KPCEtLSBjaXMkQ2lzX2luZHVjZWR0b19EYWJ0cmFtIDwtIGNpc19pbmR1Y2VkdG9fZGFidHJhbV9mb3J2bG4gLS0+CjwhLS0gSWRlbnRzKGNpcykgPC0gY2lzJENpc19pbmR1Y2VkdG9fRGFidHJhbSAtLT4KCjwhLS0gYGBgIC0tPgoKPCEtLSAjIFBsb3QgdGhlIERhYiByZXNpc3RhbnQgY2VsbHMgb24gbmFpdmUgdW1hcCAtLT4KPCEtLSBgYGB7ciBpbmNsdWRlID0gRkFMU0V9IC0tPgo8IS0tIHBkZignMjAyMl8wMV8xNF9hbmFseXNpc19zY3JpcHRzLzIwMjJfMDVfMjdfYW5hbHlzaXMvSW5kdWNlZF9SZXNpc3RhbmNlL2Npc19pbmR1Y2VkdG9fZGFidHJhbV9NYXJrZXJzLnBkZicpIC0tPgo8IS0tIERpbVBsb3QoY2lzLCByZWR1Y3Rpb24gPSAidW1hcCIsIGRpbXMgPSBjKDEsMiksIC0tPgo8IS0tICAgICAgICAgZ3JvdXAuYnkgPSAnTGluZWFnZScsIHB0LnNpemUgPSAuMSwgY2VsbHMuaGlnaGxpZ2h0ID0gbGlzdChDaXNfaW5kdWNlZHRvX0RhYnRyYW0pLCAtLT4KPCEtLSAgICAgICAgIGNvbHMuaGlnaGxpZ2h0ID0gJ2N5YW4nKSArIGdndGl0bGUocGFzdGUoJ0NpcyBpbmR1Y2VkIHRvIGRhYnRyYW0gLSAjIGNlbGxzOicsIGxlbmd0aChDaXNfaW5kdWNlZHRvX0RhYnRyYW0pKSkgLS0+Cgo8IS0tIERpbVBsb3QoY2lzLCByZWR1Y3Rpb24gPSAndW1hcCcsIGRpbXMgPSBjKDEsMikpICsgZ2d0aXRsZSgnR3JvdW5kIFRydXRocycpIC0tPgoKPCEtLSBDaXNfaW5kdWNlZHRvX0RhYnRyYW1fbWFya2VycyRkaWZmZXhwcmVzc2VkIDwtICJOTyIgLS0+CjwhLS0gIyBpZiBsb2cyRm9sZGNoYW5nZSA+IDAuNiBhbmQgcHZhbHVlIDwgMC4wNSwgc2V0IGFzICJVUCIgIC0tPgo8IS0tIENpc19pbmR1Y2VkdG9fRGFidHJhbV9tYXJrZXJzJGRpZmZleHByZXNzZWRbQ2lzX2luZHVjZWR0b19EYWJ0cmFtX21hcmtlcnMkYXZnX2xvZzJGQyA+IDEgJiBDaXNfaW5kdWNlZHRvX0RhYnRyYW1fbWFya2VycyRwX3ZhbCA8IDAuMDVdIDwtICJVUCIgLS0+CjwhLS0gIyBpZiBsb2cyRm9sZGNoYW5nZSA8IC0wLjYgYW5kIHB2YWx1ZSA8IDAuMDUsIHNldCBhcyAiRE9XTiIgLS0+CjwhLS0gQ2lzX2luZHVjZWR0b19EYWJ0cmFtX21hcmtlcnMkZGlmZmV4cHJlc3NlZFtDaXNfaW5kdWNlZHRvX0RhYnRyYW1fbWFya2VycyRhdmdfbG9nMkZDIDwgLTEgJiBDaXNfaW5kdWNlZHRvX0RhYnRyYW1fbWFya2VycyRwX3ZhbCA8IDAuMDVdIDwtICJET1dOIiAtLT4KCjwhLS0gQ2lzX2luZHVjZWR0b19EYWJ0cmFtX21hcmtlcnMkZGVsYWJlbCA8LSBOQSAtLT4KPCEtLSBDaXNfaW5kdWNlZHRvX0RhYnRyYW1fbWFya2VycyRkZWxhYmVsW0Npc19pbmR1Y2VkdG9fRGFidHJhbV9tYXJrZXJzJGRpZmZleHByZXNzZWQgIT0gIk5PIl0gPC0gcm93bmFtZXMoQ2lzX2luZHVjZWR0b19EYWJ0cmFtX21hcmtlcnMpW0Npc19pbmR1Y2VkdG9fRGFidHJhbV9tYXJrZXJzJGRpZmZleHByZXNzZWQgIT0gIk5PIl0gLS0+Cgo8IS0tIGdncGxvdChkYXRhPUNpc19pbmR1Y2VkdG9fRGFidHJhbV9tYXJrZXJzLCBhZXMoeD1hdmdfbG9nMkZDLCB5PS1sb2cxMChwX3ZhbCksIGNvbD1kaWZmZXhwcmVzc2VkLCBsYWJlbD1kZWxhYmVsKSkgKyAtLT4KPCEtLSAgIGdlb21fcG9pbnQoKSArICAtLT4KPCEtLSAgIHRoZW1lX21pbmltYWwoKSArIC0tPgo8IS0tICAgZ2VvbV90ZXh0KCkgKyAtLT4KPCEtLSAgIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXM9YygiYmx1ZSIsICJibGFjayIsICJyZWQiKSkgKyAtLT4KPCEtLSAgIGdlb21fdmxpbmUoeGludGVyY2VwdD1jKC0xLCAxKSwgY29sPSJyZWQiKSArIC0tPgo8IS0tICAgZ2VvbV9obGluZSh5aW50ZXJjZXB0PS1sb2cxMCgwLjA1KSwgY29sPSJyZWQiKSArIC0tPgo8IS0tICAgZ2d0aXRsZSgncF92YWwnKSAtLT4KCjwhLS0gQ2lzX2luZHVjZWR0b19EYWJ0cmFtX21hcmtlcnMkZGlmZmV4cHJlc3NlZCA8LSAiTk8iIC0tPgo8IS0tICMgaWYgbG9nMkZvbGRjaGFuZ2UgPiAwLjYgYW5kIHB2YWx1ZSA8IDAuMDUsIHNldCBhcyAiVVAiICAtLT4KPCEtLSBDaXNfaW5kdWNlZHRvX0RhYnRyYW1fbWFya2VycyRkaWZmZXhwcmVzc2VkW0Npc19pbmR1Y2VkdG9fRGFidHJhbV9tYXJrZXJzJGF2Z19sb2cyRkMgPiAxICYgQ2lzX2luZHVjZWR0b19EYWJ0cmFtX21hcmtlcnMkcF92YWxfYWRqIDwgMC4wNV0gPC0gIlVQIiAtLT4KPCEtLSAjIGlmIGxvZzJGb2xkY2hhbmdlIDwgLTAuNiBhbmQgcHZhbHVlIDwgMC4wNSwgc2V0IGFzICJET1dOIiAtLT4KPCEtLSBDaXNfaW5kdWNlZHRvX0RhYnRyYW1fbWFya2VycyRkaWZmZXhwcmVzc2VkW0Npc19pbmR1Y2VkdG9fRGFidHJhbV9tYXJrZXJzJGF2Z19sb2cyRkMgPCAtMSAmIENpc19pbmR1Y2VkdG9fRGFidHJhbV9tYXJrZXJzJHBfdmFsX2FkaiA8IDAuMDVdIDwtICJET1dOIiAtLT4KCjwhLS0gQ2lzX2luZHVjZWR0b19EYWJ0cmFtX21hcmtlcnMkZGVsYWJlbCA8LSBOQSAtLT4KPCEtLSBDaXNfaW5kdWNlZHRvX0RhYnRyYW1fbWFya2VycyRkZWxhYmVsW0Npc19pbmR1Y2VkdG9fRGFidHJhbV9tYXJrZXJzJGRpZmZleHByZXNzZWQgIT0gIk5PIl0gPC0gcm93bmFtZXMoQ2lzX2luZHVjZWR0b19EYWJ0cmFtX21hcmtlcnMpW0Npc19pbmR1Y2VkdG9fRGFidHJhbV9tYXJrZXJzJGRpZmZleHByZXNzZWQgIT0gIk5PIl0gLS0+CgoKPCEtLSBnZ3Bsb3QoZGF0YT1DaXNfaW5kdWNlZHRvX0RhYnRyYW1fbWFya2VycywgYWVzKHg9YXZnX2xvZzJGQywgeT0tbG9nMTAocF92YWxfYWRqKSwgY29sPWRpZmZleHByZXNzZWQsIGxhYmVsPWRlbGFiZWwpKSArIC0tPgo8IS0tICAgZ2VvbV9wb2ludCgpICsgIC0tPgo8IS0tICAgdGhlbWVfbWluaW1hbCgpICsgLS0+CjwhLS0gICBnZW9tX3RleHQoKSArIC0tPgo8IS0tICAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcz1jKCJibHVlIiwgImJsYWNrIiwgInJlZCIpKSArIC0tPgo8IS0tICAgZ2VvbV92bGluZSh4aW50ZXJjZXB0PWMoLTEsIDEpLCBjb2w9InJlZCIpICsgLS0+CjwhLS0gICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQ9LWxvZzEwKDAuMDUpLCBjb2w9InJlZCIpICsgIC0tPgo8IS0tICAgZ2d0aXRsZSgncF92YWxfYWRqJykgLS0+CgoKPCEtLSBmb3IgKGkgaW4gcm93bmFtZXMoQ2lzX2luZHVjZWR0b19EYWJ0cmFtX21hcmtlcnMpW29yZGVyKENpc19pbmR1Y2VkdG9fRGFidHJhbV9tYXJrZXJzJGF2Z19sb2cyRkMsIGRlY3JlYXNpbmcgPSBUKV1bMToyMF0peyAtLT4KPCEtLSAgIHAxIDwtIEZlYXR1cmVQbG90KGNpcywgZmVhdHVyZXMgPSBpKSAmIHNjYWxlX2NvbG91cl9ncmFkaWVudG4oY29sb3JzID0gcmV2KGJyZXdlci5wYWwobiA9IDExLCBuYW1lID0gJ1JkQnUnKSkpIC0tPgo8IS0tICAgcDIgPC0gRmVhdHVyZVBsb3QoY2lzX2ZpcnN0LCBmZWF0dXJlcyA9IGkpICYgc2NhbGVfY29sb3VyX2dyYWRpZW50bihjb2xvcnMgPSByZXYoYnJld2VyLnBhbChuID0gMTEsIG5hbWUgPSAnUmRCdScpKSkgLS0+CjwhLS0gICBwcmludChwbG90X2dyaWQocDEscDIpKSAtLT4KPCEtLSB9IC0tPgoKPCEtLSBmb3IgKGkgaW4gcm93bmFtZXMoQ2lzX2luZHVjZWR0b19EYWJ0cmFtX21hcmtlcnMpW29yZGVyKENpc19pbmR1Y2VkdG9fRGFidHJhbV9tYXJrZXJzJGF2Z19sb2cyRkMsIGRlY3JlYXNpbmcgPSBUKV1bMToyMF0peyAtLT4KPCEtLSAgIHByaW50KFJpZGdlUGxvdChjaXMsIGZlYXR1cmVzID0gaSwgaWRlbnRzID0gYygnSW5kdWNlZCBSZXNpc3RhbnQnLCdTZW5zaXRpdmUnKSwgY29scyA9IGMoJ2dyZXknLCAnY3lhbicpKSkgLS0+CjwhLS0gfSAtLT4KPCEtLSBkZXYub2ZmKCkgLS0+CjwhLS0gYGBgIC0tPgoKPCEtLSAjIENpcyBpbmR1Y2VkIHRvIGNvY2wyIC0tPgo8IS0tIGBgYHtyfSAtLT4KPCEtLSBDaXNfbm90X2luZHVjZWR0b19Db0NsMiA8LSBuYW1lcyhjaXMkb3JpZy5pZGVudFtjaXMkTGluZWFnZSAlbmluJSBjKGZpbmFsX2luZHVjZWRfcmVzaXN0YW50X2xpbnMkQ2lzX0luZHVjZWR0b19Db0NsMiwiTm8gQmFyY29kZSIsIlN0aWxsIG11bHRpcGxlIikgXSkgIC0tPgo8IS0tIENpc19pbmR1Y2VkdG9fQ29DbDIgPC0gbmFtZXMoY2lzJG9yaWcuaWRlbnRbY2lzJExpbmVhZ2UgJWluJSBmaW5hbF9pbmR1Y2VkX3Jlc2lzdGFudF9saW5zJENpc19JbmR1Y2VkdG9fQ29DbDJdKSAtLT4KCjwhLS0gIyBHZXQgbWFya2VycyBvZiBkYWJyYWZlbmliIGluZHVjZWQgdG8gY29jbDIgcmVzaXN0YW5jZSAtLT4KPCEtLSBDaXNfaW5kdWNlZHRvX0NvQ2wyX21hcmtlcnMgPC0gRmluZE1hcmtlcnMoY2lzLCBpZGVudC4xID0gQ2lzX25vdF9pbmR1Y2VkdG9fQ29DbDIsIGlkZW50LjIgPSBDaXNfaW5kdWNlZHRvX0NvQ2wyLCBsb2dmYy50aHJlc2hvbGQgPSAwLjI1KSAtLT4KCjwhLS0gIyBtYWtlIG1ldGFkYXRhIG9iamVjdCBmb3IgZGFicmFmZW5pYiBpbmR1Y2VkIHRvIGNvY2wyIHJlc2lzdGFuY2UgLS0+CjwhLS0gY2lzX2luZHVjZWR0b19jb2NsMl9mb3J2bG4gPC0gcmVwKDAsIGxlbmd0aChuYW1lcyhjaXMkTGluZWFnZSkpKSAtLT4KPCEtLSBjaXNfaW5kdWNlZHRvX2NvY2wyX2ZvcnZsblt3aGljaChjaXMkTGluZWFnZSAlbmluJSBjKGZpbmFsX2luZHVjZWRfcmVzaXN0YW50X2xpbnMkQ2lzX0luZHVjZWR0b19Db0NsMiwiTm8gQmFyY29kZSIsIlN0aWxsIG11bHRpcGxlIikpXSA8LSAnU2Vuc2l0aXZlJyAtLT4KPCEtLSBjaXNfaW5kdWNlZHRvX2NvY2wyX2ZvcnZsblt3aGljaChjaXMkTGluZWFnZSAlaW4lIGMoZmluYWxfaW5kdWNlZF9yZXNpc3RhbnRfbGlucyRDaXNfSW5kdWNlZHRvX0NvQ2wyKSldIDwtICdJbmR1Y2VkIFJlc2lzdGFudCcgLS0+CjwhLS0gY2lzX2luZHVjZWR0b19jb2NsMl9mb3J2bG5bd2hpY2goY2lzJExpbmVhZ2UgJWluJSBjKCJObyBCYXJjb2RlIiwiU3RpbGwgbXVsdGlwbGUiKSldIDwtICdObyBCYXJjb2RlJyAtLT4KPCEtLSBjaXMkQ2lzX2luZHVjZWR0b19Db0NsMiA8LSBjaXNfaW5kdWNlZHRvX2NvY2wyX2ZvcnZsbiAtLT4KPCEtLSBJZGVudHMoY2lzKSA8LSBjaXMkQ2lzX2luZHVjZWR0b19Db0NsMiAtLT4KCjwhLS0gYGBgIC0tPgoKPCEtLSAjIFBsb3QgdGhlIERhYiByZXNpc3RhbnQgY2VsbHMgb24gbmFpdmUgdW1hcCAtLT4KPCEtLSBgYGB7ciBpbmNsdWRlID0gRkFMU0V9IC0tPgo8IS0tIHBkZignMjAyMl8wMV8xNF9hbmFseXNpc19zY3JpcHRzLzIwMjJfMDVfMjdfYW5hbHlzaXMvSW5kdWNlZF9SZXNpc3RhbmNlL2Npc19pbmR1Y2VkdG9fY29jbDJfTWFya2Vycy5wZGYnKSAtLT4KPCEtLSBEaW1QbG90KGNpcywgcmVkdWN0aW9uID0gInVtYXAiLCBkaW1zID0gYygxLDIpLCAtLT4KPCEtLSAgICAgICAgIGdyb3VwLmJ5ID0gJ0xpbmVhZ2UnLCBwdC5zaXplID0gLjEsIGNlbGxzLmhpZ2hsaWdodCA9IGxpc3QoQ2lzX2luZHVjZWR0b19Db0NsMiksIC0tPgo8IS0tICAgICAgICAgY29scy5oaWdobGlnaHQgPSAnY3lhbicpICsgZ2d0aXRsZShwYXN0ZSgnQ2lzIGluZHVjZWQgdG8gY29jbDIgLSAjIGNlbGxzOicsIGxlbmd0aChDaXNfaW5kdWNlZHRvX0NvQ2wyKSkpIC0tPgoKPCEtLSBEaW1QbG90KGNpcywgcmVkdWN0aW9uID0gJ3VtYXAnLCBkaW1zID0gYygxLDIpKSArIGdndGl0bGUoJ0dyb3VuZCBUcnV0aHMnKSAtLT4KCjwhLS0gQ2lzX2luZHVjZWR0b19Db0NsMl9tYXJrZXJzJGRpZmZleHByZXNzZWQgPC0gIk5PIiAtLT4KPCEtLSAjIGlmIGxvZzJGb2xkY2hhbmdlID4gMC42IGFuZCBwdmFsdWUgPCAwLjA1LCBzZXQgYXMgIlVQIiAgLS0+CjwhLS0gQ2lzX2luZHVjZWR0b19Db0NsMl9tYXJrZXJzJGRpZmZleHByZXNzZWRbQ2lzX2luZHVjZWR0b19Db0NsMl9tYXJrZXJzJGF2Z19sb2cyRkMgPiAxICYgQ2lzX2luZHVjZWR0b19Db0NsMl9tYXJrZXJzJHBfdmFsIDwgMC4wNV0gPC0gIlVQIiAtLT4KPCEtLSAjIGlmIGxvZzJGb2xkY2hhbmdlIDwgLTAuNiBhbmQgcHZhbHVlIDwgMC4wNSwgc2V0IGFzICJET1dOIiAtLT4KPCEtLSBDaXNfaW5kdWNlZHRvX0NvQ2wyX21hcmtlcnMkZGlmZmV4cHJlc3NlZFtDaXNfaW5kdWNlZHRvX0NvQ2wyX21hcmtlcnMkYXZnX2xvZzJGQyA8IC0xICYgQ2lzX2luZHVjZWR0b19Db0NsMl9tYXJrZXJzJHBfdmFsIDwgMC4wNV0gPC0gIkRPV04iIC0tPgoKPCEtLSBDaXNfaW5kdWNlZHRvX0NvQ2wyX21hcmtlcnMkZGVsYWJlbCA8LSBOQSAtLT4KPCEtLSBDaXNfaW5kdWNlZHRvX0NvQ2wyX21hcmtlcnMkZGVsYWJlbFtDaXNfaW5kdWNlZHRvX0NvQ2wyX21hcmtlcnMkZGlmZmV4cHJlc3NlZCAhPSAiTk8iXSA8LSByb3duYW1lcyhDaXNfaW5kdWNlZHRvX0NvQ2wyX21hcmtlcnMpW0Npc19pbmR1Y2VkdG9fQ29DbDJfbWFya2VycyRkaWZmZXhwcmVzc2VkICE9ICJOTyJdIC0tPgoKPCEtLSBnZ3Bsb3QoZGF0YT1DaXNfaW5kdWNlZHRvX0NvQ2wyX21hcmtlcnMsIGFlcyh4PWF2Z19sb2cyRkMsIHk9LWxvZzEwKHBfdmFsKSwgY29sPWRpZmZleHByZXNzZWQsIGxhYmVsPWRlbGFiZWwpKSArIC0tPgo8IS0tICAgZ2VvbV9wb2ludCgpICsgIC0tPgo8IS0tICAgdGhlbWVfbWluaW1hbCgpICsgLS0+CjwhLS0gICBnZW9tX3RleHQoKSArIC0tPgo8IS0tICAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcz1jKCJibHVlIiwgImJsYWNrIiwgInJlZCIpKSArIC0tPgo8IS0tICAgZ2VvbV92bGluZSh4aW50ZXJjZXB0PWMoLTEsIDEpLCBjb2w9InJlZCIpICsgLS0+CjwhLS0gICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQ9LWxvZzEwKDAuMDUpLCBjb2w9InJlZCIpICsgLS0+CjwhLS0gICBnZ3RpdGxlKCdwX3ZhbCcpIC0tPgoKPCEtLSBDaXNfaW5kdWNlZHRvX0NvQ2wyX21hcmtlcnMkZGlmZmV4cHJlc3NlZCA8LSAiTk8iIC0tPgo8IS0tICMgaWYgbG9nMkZvbGRjaGFuZ2UgPiAwLjYgYW5kIHB2YWx1ZSA8IDAuMDUsIHNldCBhcyAiVVAiICAtLT4KPCEtLSBDaXNfaW5kdWNlZHRvX0NvQ2wyX21hcmtlcnMkZGlmZmV4cHJlc3NlZFtDaXNfaW5kdWNlZHRvX0NvQ2wyX21hcmtlcnMkYXZnX2xvZzJGQyA+IDEgJiBDaXNfaW5kdWNlZHRvX0NvQ2wyX21hcmtlcnMkcF92YWxfYWRqIDwgMC4wNV0gPC0gIlVQIiAtLT4KPCEtLSAjIGlmIGxvZzJGb2xkY2hhbmdlIDwgLTAuNiBhbmQgcHZhbHVlIDwgMC4wNSwgc2V0IGFzICJET1dOIiAtLT4KPCEtLSBDaXNfaW5kdWNlZHRvX0NvQ2wyX21hcmtlcnMkZGlmZmV4cHJlc3NlZFtDaXNfaW5kdWNlZHRvX0NvQ2wyX21hcmtlcnMkYXZnX2xvZzJGQyA8IC0xICYgQ2lzX2luZHVjZWR0b19Db0NsMl9tYXJrZXJzJHBfdmFsX2FkaiA8IDAuMDVdIDwtICJET1dOIiAtLT4KCjwhLS0gQ2lzX2luZHVjZWR0b19Db0NsMl9tYXJrZXJzJGRlbGFiZWwgPC0gTkEgLS0+CjwhLS0gQ2lzX2luZHVjZWR0b19Db0NsMl9tYXJrZXJzJGRlbGFiZWxbQ2lzX2luZHVjZWR0b19Db0NsMl9tYXJrZXJzJGRpZmZleHByZXNzZWQgIT0gIk5PIl0gPC0gcm93bmFtZXMoQ2lzX2luZHVjZWR0b19Db0NsMl9tYXJrZXJzKVtDaXNfaW5kdWNlZHRvX0NvQ2wyX21hcmtlcnMkZGlmZmV4cHJlc3NlZCAhPSAiTk8iXSAtLT4KCgo8IS0tIGdncGxvdChkYXRhPUNpc19pbmR1Y2VkdG9fQ29DbDJfbWFya2VycywgYWVzKHg9YXZnX2xvZzJGQywgeT0tbG9nMTAocF92YWxfYWRqKSwgY29sPWRpZmZleHByZXNzZWQsIGxhYmVsPWRlbGFiZWwpKSArIC0tPgo8IS0tICAgZ2VvbV9wb2ludCgpICsgIC0tPgo8IS0tICAgdGhlbWVfbWluaW1hbCgpICsgLS0+CjwhLS0gICBnZW9tX3RleHQoKSArIC0tPgo8IS0tICAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcz1jKCJibHVlIiwgImJsYWNrIiwgInJlZCIpKSArIC0tPgo8IS0tICAgZ2VvbV92bGluZSh4aW50ZXJjZXB0PWMoLTEsIDEpLCBjb2w9InJlZCIpICsgLS0+CjwhLS0gICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQ9LWxvZzEwKDAuMDUpLCBjb2w9InJlZCIpICsgIC0tPgo8IS0tICAgZ2d0aXRsZSgncF92YWxfYWRqJykgLS0+CgoKPCEtLSBmb3IgKGkgaW4gcm93bmFtZXMoQ2lzX2luZHVjZWR0b19Db0NsMl9tYXJrZXJzKVtvcmRlcihDaXNfaW5kdWNlZHRvX0NvQ2wyX21hcmtlcnMkYXZnX2xvZzJGQywgZGVjcmVhc2luZyA9IFQpXVsxOjIwXSl7IC0tPgo8IS0tICAgcDEgPC0gRmVhdHVyZVBsb3QoY2lzLCBmZWF0dXJlcyA9IGkpICYgc2NhbGVfY29sb3VyX2dyYWRpZW50bihjb2xvcnMgPSByZXYoYnJld2VyLnBhbChuID0gMTEsIG5hbWUgPSAnUmRCdScpKSkgLS0+CjwhLS0gICBwMiA8LSBGZWF0dXJlUGxvdChjaXNfZmlyc3QsIGZlYXR1cmVzID0gaSkgJiBzY2FsZV9jb2xvdXJfZ3JhZGllbnRuKGNvbG9ycyA9IHJldihicmV3ZXIucGFsKG4gPSAxMSwgbmFtZSA9ICdSZEJ1JykpKSAtLT4KPCEtLSAgIHByaW50KHBsb3RfZ3JpZChwMSxwMikpIC0tPgo8IS0tIH0gLS0+Cgo8IS0tIGZvciAoaSBpbiByb3duYW1lcyhDaXNfaW5kdWNlZHRvX0NvQ2wyX21hcmtlcnMpW29yZGVyKENpc19pbmR1Y2VkdG9fQ29DbDJfbWFya2VycyRhdmdfbG9nMkZDLCBkZWNyZWFzaW5nID0gVCldWzE6MjBdKXsgLS0+CjwhLS0gICBwcmludChSaWRnZVBsb3QoY2lzLCBmZWF0dXJlcyA9IGksIGlkZW50cyA9IGMoJ0luZHVjZWQgUmVzaXN0YW50JywnU2Vuc2l0aXZlJyksIGNvbHMgPSBjKCdncmV5JywgJ2N5YW4nKSkpIC0tPgo8IS0tIH0gLS0+CjwhLS0gZGV2Lm9mZigpIC0tPgo8IS0tIGBgYCAtLT4KCg==